Làm cách nào để cho phép assembly (một đơn vị thử nghiệm) truy cập các thuộc tính bên trong của một assembly khác?


80

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:


107

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.


3
Tôi vừa làm điều này thành công với một hội đồng được đặt tên mạnh theo hướng dẫn mà aku liên kết đến. Tôi đã có một vấn đề mặc dù. Sau khi cấu hình xong mọi thứ, tôi phải khởi động lại Visual Studio để Intellisense hoạt động. Nó sẽ biên dịch trước khi khởi động lại nhưng sẽ luôn hiển thị các dòng màu đỏ.
Eric Schoonover 24-08

20

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


9

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!


5
Cách tiếp cận thú vị. Và tôi hoàn toàn đồng ý về việc các bài kiểm tra được công khai. Yêu cầu ngu ngốc, IMO.
Kilhoffer

@Kilhoffer: Tôi đã phàn nàn về điều đó trong nhiều năm, và bạn là người đầu tiên thực sự đồng ý với tôi. Cảm ơn!
Jay Bazuzi

6
Nếu bạn sử dụng [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.
xmedeko

3

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 đó.


Tôi sẽ bình luận chính xác những gì bạn nói khi tôi nhận thấy bình luận của bạn ở phía dưới. +1! :)
Bjorn Reppen 09/09/08

2

Bạn có thể sử dụng phản chiếu (như các mục Kiểm tra MS), hoặc bạn có thể khai báo cụm kiểm tra đơn vị là bạn của cụm lõi.

Tùy chọn khác là đặt các bài kiểm tra đơn vị trong cùng một cụm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.