Tôi muốn tập hợp Core của mình không để lộ một lớp nhất định và tôi vẫn muốn có thể kiểm tra nó. Làm thế nào tôi có thể làm điều đó ?
Tôi muốn tập hợp Core của mình không để lộ một lớp nhất định và tôi vẫn muốn có thể kiểm tra nó. Làm thế nào tôi có thể làm điều đó ?
Câu trả lời:
Thuộc tính InternalsVibleTo để giải cứu!
Chỉ cần thêm:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
vào tệp AssemblyInfo.cs lớp Core của bạn
Xem Hội bạn bè (Hướng dẫn lập trình C #) để biết các phương pháp hay nhất.
Với InternalsVible nếu các tổ hợp của bạn được đặt tên mạnh, bạn cần chỉ định khóa công khai (lưu ý: khóa đầy đủ không phải mã thông báo khóa công khai) chẳng hạn ...
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]
và thủ thuật sau đây thực sự hữu ích để lấy khóa công khai mà không cần dùng đến dòng cmd ...
http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx
Tôi đặt các bài kiểm tra đơn vị của mình trong cùng một lắp ráp với mã mà nó đang kiểm tra. Điều này có ý nghĩa với tôi, bởi vì tôi nghĩ "kiểm tra bản thân" như một tính năng của một lớp học, cùng với những thứ như "tự khởi tạo" và "mô tả bản thân".
Tôi đã nghe một số phản đối đối với cách tiếp cận này, nhưng một số ít trong số đó thuyết phục được.
Nó làm tổn thương hiệu suất Bah, tôi nói! Đừng tối ưu hóa mà không có dữ liệu cứng! Có lẽ nếu bạn đang lên kế hoạch cho các tập hợp của mình được tải xuống qua các liên kết chậm, thì việc giảm thiểu kích thước lắp ráp sẽ rất đáng giá.
Đó là một rủi ro bảo mật . Chỉ khi bạn có bí mật trong các bài kiểm tra của mình. Đừng làm vậy.
Bây giờ, hoàn cảnh của bạn khác với tôi, vì vậy có thể nó sẽ hợp lý với bạn, và có thể nó sẽ không. Bạn sẽ phải tự mình tìm ra điều đó.
Bên cạnh: Trong C #, tôi đã từng thử đặt các bài kiểm tra đơn vị của mình trong một lớp có tên "Kiểm tra" được lồng bên trong lớp mà nó đang kiểm tra. Điều này làm cho việc tổ chức chính xác của mọi thứ trở nên rõ ràng. Nó cũng tránh được sự trùng lặp tên xảy ra khi các bài kiểm tra cho lớp "Foo" trong một lớp được gọi là "FooTests". Tuy nhiên, các khuôn khổ thử nghiệm đơn vị mà tôi có quyền truy cập đã từ chối chấp nhận các thử nghiệm không được đánh dấu là "công khai". Điều này có nghĩa là lớp bạn đang kiểm tra không thể là "riêng tư". Tôi không thể nghĩ ra bất kỳ lý do chính đáng nào để yêu cầu các bài kiểm tra phải là "công khai", vì không ai thực sự gọi chúng là phương pháp công khai - mọi thứ đều thông qua phản ánh. Nếu bạn đã từng viết một khuôn khổ kiểm thử đơn vị cho .Net, vui lòng xem xét việc cho phép các bài kiểm tra không công khai, vì lợi ích của tôi!
[Conditional("DEBUG")]
trên các lớp thử nghiệm thì chúng không được ở trong quá trình lắp ráp sản xuất và không làm ảnh hưởng đến hiệu suất.
Tôi khuyên bạn không nên đi đến những rắc rối như vậy ... nếu bạn thực sự muốn kiểm tra đơn vị các lớp "nội bộ" của mình, chỉ cần ẩn chúng đi trong một không gian tên mà chỉ mã nội bộ của bạn mới sử dụng. Trừ khi bạn đang viết một khuôn khổ trên quy mô của khuôn khổ .NET, bạn không thực sự cần mức ẩn đó.