2008-12-11 26 views
284

Tôi mới trong thử nghiệm đơn vị và tôi đang cố gắng tìm hiểu xem tôi có nên bắt đầu sử dụng thêm công cụ sửa đổi truy cập 'nội bộ' hay không. Tôi biết rằng nếu chúng ta sử dụng 'internal' và thiết lập biến assembly 'InternalsVisibleTo', chúng ta có thể test các hàm mà chúng ta không muốn khai báo public từ dự án thử nghiệm. Điều này làm cho tôi nghĩ rằng tôi nên luôn luôn sử dụng 'nội bộ' bởi vì ít nhất mỗi dự án (nên?) Có dự án thử nghiệm riêng của nó. Các bạn có thể cho tôi biết lý do tại sao tôi không nên làm điều này? Khi nào tôi nên sử dụng 'riêng tư'?Công cụ sửa đổi truy cập "# nội bộ" C# khi thực hiện kiểm tra đơn vị

+0

Đáng nói đến - bạn thường có thể tránh sự cần thiết phải kiểm tra đơn vị phương pháp nội bộ của bạn bằng cách sử dụng 'System.Diagnostics.Debug.Assert()' trong chính các phương thức đó. –

Trả lời

867

lớp nội cần phải được kiểm tra và có một thuộc tính assemby:

using System.Runtime.CompilerServices; 

[assembly:InternalsVisibleTo("MyTests")] 

Thêm phần này vào các tập tin thông tin dự án, ví dụ Properties\AssemblyInfo.cs.

+2

Tôi có thêm điều này vào dự án thử nghiệm hoặc dự án đang được thử nghiệm không?!?! – akuhn

+53

Thêm vào dự án đang được thử nghiệm (ví dụ: Thuộc tính \ AssemblyInfo.cs). "MyTests" sẽ là hội đồng thử nghiệm. – EricSchaefer

+78

Đây thực sự là câu trả lời được chấp nhận. Tôi không biết về các bạn, nhưng khi các bài kiểm tra "quá xa" từ mã họ đang thử, tôi có xu hướng lo lắng. Tôi là tất cả để tránh kiểm tra bất cứ điều gì được đánh dấu là 'tư nhân', nhưng có quá nhiều thứ 'riêng tư' có thể trỏ đến một lớp' nội bộ 'đang vật lộn để được trích xuất. TDD hoặc không có TDD, tôi thích có nhiều thử nghiệm kiểm tra nhiều mã hơn là có một vài thử nghiệm thực thi cùng một lượng mã. Và tránh kiểm tra nội dung 'nội bộ' không chính xác giúp đạt được tỷ lệ tốt. –

8

Bạn cũng có thể sử dụng riêng tư và bạn có thể gọi các phương thức riêng tư với sự phản chiếu. Nếu bạn đang sử dụng Visual Studio Team Suite nó có một số chức năng tốt đẹp mà sẽ tạo ra một proxy để gọi phương pháp riêng của bạn cho bạn. Dưới đây là một bài viết dự án mã đó chứng tỏ làm thế nào bạn có thể làm công việc mình đến các phương pháp kiểm tra đơn vị tư nhân và bảo vệ:

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

Về mặt mà truy cập vào modifier bạn nên sử dụng, nguyên tắc chung của tôi về ngón tay cái là bắt đầu với tin và leo thang khi cần thiết. Bằng cách đó, bạn sẽ tiết lộ rất ít chi tiết nội bộ của lớp học của bạn như là thật sự cần thiết và nó giúp giữ cho các chi tiết thực hiện ẩn, như họ cần.

93

Nếu bạn muốn thử nghiệm các phương pháp riêng tư, hãy xem PrivateObjectPrivateType trong không gian tên Microsoft.VisualStudio.TestTools.UnitTesting. Chúng cung cấp các trình bao bọc dễ sử dụng xung quanh mã phản chiếu cần thiết.

Documents: PrivateType, PrivateObject

+6

Khi bỏ phiếu xuống, vui lòng để lại nhận xét. Cảm ơn. –

+26

Thật là ngu ngốc khi bỏ phiếu cho câu trả lời này. Nó chỉ ra một giải pháp mới và một giải pháp thực sự không được đề cập trước đây. –

8

tiếp tục sử dụng tin theo mặc định. Nếu một thành viên không nên tiếp xúc với loại đó, nó không nên bị lộ ra ngoài loại đó, ngay cả trong cùng một dự án. Điều này giúp mọi thứ an toàn hơn và tiện lợi hơn - khi bạn đang sử dụng đối tượng, rõ ràng hơn là phương pháp nào bạn có thể sử dụng.

Có nói rằng, tôi nghĩ rằng nó là hợp lý để làm cho phương pháp tự nhiên tư nhân nội bộ cho mục đích thử nghiệm đôi khi. Tôi thích điều đó bằng cách sử dụng sự phản chiếu, đó là tái cấu trúc - không thân thiện.

Một điều cần xem xét có thể là một "ForTest" hậu tố:

internal void DoThisForTest(string name) 
{ 
    DoThis(name); 
} 

private void DoThis(string name) 
{ 
    // Real implementation 
} 

Sau đó, khi bạn đang sử dụng các lớp trong cùng một dự án, đó là rõ ràng (hiện tại và trong tương lai) mà bạn không nên thực sự đang sử dụng phương pháp này - nó chỉ có cho mục đích thử nghiệm. Đây là một chút hacky, và không phải cái gì tôi làm bản thân mình, nhưng nó ít nhất là giá trị xem xét.

+1

Nếu phương pháp này là nội bộ, điều này không ngăn cản việc sử dụng nó từ hội đồng kiểm tra? –

+0

@Ralph: Không sử dụng InternalsVisibleTo. –

+3

Tôi thỉnh thoảng sử dụng phương pháp 'ForTest' nhưng tôi luôn thấy nó chết xấu xí (thêm mã không cung cấp giá trị thực tế về mặt logic nghiệp vụ sản xuất). Thông thường tôi thấy mình phải sử dụng phương pháp này bởi vì thiết kế là một điều không may mắn (tức làphải thiết lập lại các trường hợp đơn giữa các bài kiểm tra) – ChrisWue

Các vấn đề liên quan