Mục đích của Verifiable () trong Moq là gì?


125

Mục đích là Verifiable()gì?

Nếu tôi xác minh a Mockvà bỏ qua điều này, nó vẫn xác minh SetUp.

Chỉnh sửa: Tôi đang sử dụng VerifyAll()lý do để mọi thứ được xác minh. Sau khi thay đổi thành Verify()chỉ .Verifiable() SetUps của tôi được kiểm tra.

Câu trả lời:


83

ADDENDUM: Như câu trả lời khác đã nêu, mục đích của .Verifiablelà nhập Setupmột tập hợp các " Verify(...)cuộc gọi hoãn " mà sau đó có thể được kích hoạt thông qua mock.Verify().

Sự giải thích của OP làm rõ rằng đây là mục tiêu và vấn đề duy nhất là tìm ra lý do tại sao nó không hoạt động, nhưng như @Liam đã đề xướng, câu trả lời cũng thực sự nên chạm vào điều này: - Các trường hợp sử dụng quan trọng theo tôi có thể thấy là:

  • duy trì độ KHÔ giữa a mock.Setup()mock.Verify
  • cho phép một người ngắt kết nối cấu hình xác minh khỏi Verifychính cuộc gọi thực tế (ví dụ: bạn có thể thiết lập nó trong một phương thức trợ giúp khác)

... và trở lại câu trả lời của tôi, câu nói ngắn gọn có hiệu quả "hãy cẩn thận vì những ưu điểm ở trên thường được coi là vượt trội hơn bởi ảnh hưởng của việc đạt được những mục tiêu đó đối với tính dễ đọc và khả năng duy trì của các bài kiểm tra dựa quá nhiều vào các cấu trúc như vậy"

GỐC: Lưu ý rằng nếu có thể, thay vào đó, người ta nên tuân theo bố cục AAA và do đó người ta nên thực hiện mock.Verify( expression )các lệnh gọi rõ ràng sau khi công việc đã hoàn thành, thay vì mock.Setup( ... ).Verifiable()được ghép nối với một mock.Verify()hoặcmock.VerifyAll() bất cứ nơi nào có thể (tín dụng: @kzu ).


7
@EricSmith Nhìn lại, không nghĩ rằng tôi đã đặt nó đủ mạnh. Có nhiều lợi ích hơn từ việc chia nhỏ công việc của bạn thành nhóm AAA hơn là tập trung quá mức vào những điểm chung giữa giai đoạn Sắp xếp và Khẳng định. 90% thời gian, có điều gì đó sẽ đạt được từ các sắc thái của cách bạn thể hiện các lệnh gọi Xác minh ở cuối, vì vậy bạn nên dành nhiều thời gian để tối ưu hóa điều đó, ngay cả khi trong một số trường hợp, nếu có vẻ như là một số trùng lặp đáng tiếc. Một trong những điểm mà manning.com/osherove tạo ra rất tốt là làm cho một bài kiểm tra có ý nghĩa đối với một người nào đó nhảy vào là rất quan trọng - ngoài ra hãy tuân theo quy ước!
Ruben Bartelink 14/02/12

3
Thông thường, tôi không phải là người đi ngược lại giới hạn của sự khôn ngoan được chấp nhận nhưng tôi vẫn chưa bị thuyết phục về lợi ích của AAA so với Verifyable()/ VerifyAll()trong mọi trường hợp. Bài kiểm tra đơn vị hiện tại của tôi có một số lượng lớn Setup(...)cuộc gọi (> 30). Có thể khớp từng cái với một Verify () tương đương để đáp ứng quy ước nhưng điều này gây ra một lượng lớn mã trùng lặp và sẽ khó duy trì và đọc hơn khi số lượng bài kiểm tra đơn vị tăng lên. Tôi đoán những gì tôi thực sự đang hỏi là liệu có thể thực hiện ngoại lệ nếu có một số lượng lớn các Thiết lập hay là việc tránh Verifiable()một quy tắc cứng và nhanh?
Steve Chambers

5
@SteveChambers Một yếu tố quan trọng của AAA là nó không phải là A * - nên có một Hành động duy nhất và một Khẳng định duy nhất. Vì vậy, mặc dù bạn nói đúng về mặt kỹ thuật khi nói rằng đó là ít mã hơn cho bạn, nhưng sự trùng hợp của các Thiết lập của bạn áp dụng cho Hành động (phụ) và Cảnh báo (phụ) nào sẽ luôn trở thành bãi mìn. Vì vậy, không, nó không khó và nhanh chóng, nhưng tôi sẽ nói rằng đề xuất rằng nó thậm chí gần với 50:50 sẽ là một lời khuyên rất tồi. (Cũng lưu ý rằng bạn không cần phải Thiết lập để thực hiện Xác minh trừ khi bạn đang cố gắng đưa ra một hành vi cụ thể trong Hành động- vốn là một yếu tố khác của các bài kiểm tra rõ ràng)
Ruben Bartelink

1
@Liam Và nó thực sự hoàn toàn tốt mà bạn vẫn đang thuyết phục nó là một công cụ thích hợp cho công việc của bạn - điểm thực sự của tôi là chỉ rằng nó tán thành như một cách tiếp cận chung để viết bài kiểm tra với mocks - tức là mặc dù thực tế là nó gọn gàng đạt khô giữa một Setupvà một Verify, mà có thể bị thiếu một chiến thắng có thể đạt được chỉ được thư giãn các hạn chế cao khô theo cách được đề xuất bởi AAA và gia đình của các chiến lược mạnh mẽ ngụ ý
Ruben Bartelink

1
@Liam Cảm ơn vì đã thúc đẩy; Tôi đã cập nhật câu trả lời của mình bởi vì bạn đã chính xác trong quan điểm bạn đang đưa ra. Quay lại thời điểm khi tôi trả lời những câu hỏi SO như thế này, quan điểm của tôi thường là nêu một cách cô đọng một câu trả lời nguyên tử và sau đó để những câu trả lời cạnh tranh như câu kia điền vào bản đồ. Những ngày này (nếu tôi vẫn dành thời gian để trả lời các câu hỏi), tôi có thể sẽ cố gắng đưa ra câu trả lời đầy đủ hơn mà điều này đã trở thành trong trường hợp đầu tiên.
Ruben Bartelink,

54

Khi Verify()phương thức được gọi vào cuối bài kiểm tra, nếu bất kỳ kỳ vọng nào được đánh dấu là có thể xác minh được chưa được gọi, thì một ngoại lệ là thrown.

VerifyAll() không kiểm tra các kỳ vọng có thể xác minh được.


Bạn có vui lòng giải thích thêm một chút về VerifyAll () không kiểm tra các kỳ vọng có thể xác minh được không?
JW

@JW Có nghĩa là VerifyAll xác minh tất cả các thiết lập mà không cần xem xét liệu chúng đã được đánh dấu là các kỳ vọng có thể xác minh hay chưa.
phoog
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.