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ị
Trả lời
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
.
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
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
Đâ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. –
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.
Nếu bạn muốn thử nghiệm các phương pháp riêng tư, hãy xem PrivateObject
và PrivateType
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
Khi bỏ phiếu xuống, vui lòng để lại nhận xét. Cảm ơn. –
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. –
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.
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? –
@Ralph: Không sử dụng InternalsVisibleTo. –
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
- 1. Công cụ sửa đổi truy cập tự động Refactor
- 2. Cách thực hiện kiểm tra đơn vị trong Erlang
- 3. Làm cách nào để bạn thực hiện kiểm tra đơn vị khi kết quả thay đổi?
- 4. kiểm tra đơn vị trong C++
- 5. kiểm tra đơn vị bình: gửi cookie sau khi sửa đổi phiên
- 6. Cách thay đổi công cụ sửa đổi truy cập của điều khiển người dùng
- 7. Công cụ phân tích tĩnh để kiểm tra khóa trước khi truy cập vào biến
- 8. Cách thay đổi công cụ sửa đổi truy cập mặc định trong Resharper (R #) thành nội bộ
- 9. Thực hiện `kiểm tra` hoặc 'thực hiện kiểm tra'
- 10. Công cụ để tự động tạo các bài kiểm tra đơn vị cho C++?
- 11. Kiểm tra đơn vị một Servlet Java
- 12. Lỗi chạy google bộ công cụ để kiểm tra đơn vị mac
- 13. kiểm tra đơn vị rò rỉ bộ nhớ C++
- 14. Đếm số truy vấn được thực hiện bởi NHibernate trong một bài kiểm tra đơn vị
- 15. Visual Studio 2010 không công nhận kiểm tra đơn vị
- 16. Công cụ Java để sửa đổi mã kiểm thử
- 17. Kiểm tra đơn vị Truy vấn RavenDb
- 18. Khung kiểm tra đơn vị C nào?
- 19. Scala - thiết lập kiểm tra đơn vị (sử dụng vòng loại điều chỉnh truy cập?)
- 20. Kiểm tra đơn vị không xuất hiện
- 21. Lịch sử của các công cụ sửa đổi kiểm soát truy cập như công khai/riêng tư/được bảo vệ
- 22. C++ Đơn vị kiểm tra thư viện
- 23. Thực hiện bộ đếm khách truy cập
- 24. DAO Kiểm tra đơn vị
- 25. Đơn vị kiểm tra chèn/cập nhật/xóa
- 26. Sửa đổi cài đặt ứng dụng trong các bài kiểm tra đơn vị
- 27. Các công cụ sửa đổi truy cập trên các thành viên giao diện trong C#
- 28. Công cụ sửa đổi truy cập C# chỉ hiển thị lớp trong không gian tên
- 29. Kiểm tra đơn vị CSS
- 30. làm thế nào để ghi đè php: // đầu vào khi thực hiện kiểm tra đơn vị
Đá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 đó. –