2009-07-29 38 views
24

nhóm của tôi đã đưa ra quyết định gần đây để sử dụng Moq như khuôn khổ mocking của chúng tôi cho tính linh hoạt to lớn của nó và cú pháp rất dễ đọc. Khi chúng tôi mới bắt đầu, tôi lo ngại về những câu hỏi đơn giản - tìm kiếm (ở đây, Google, v.v.) tìm thấy nhiều cuộc thảo luận về các sắc thái khác của Moq, nhưng không nhất thiết là những gì tôi theo dõi và vài câu hỏi dường như có liên quan đã biến thành tình trạng dị giáo đỏ."Ngắn mạch" phương pháp void với Moq?

Chúng tôi đang thử nghiệm một lớp có phụ thuộc bên ngoài (Amazon SimpleDb chính xác) nhưng không muốn các thử nghiệm của chúng tôi buộc phải kết nối trực tiếp. Một phương pháp cụ thể:

  • Áp dụng một số "kinh doanh" logic
  • Nếu thích hợp, gọi một cuộc gọi ra SDB thông qua một nhà cung cấp, chúng tôi đã xây dựng, chúng ta hãy gọi nó SaveItem()

Tôi muốn đơn vị kiểm tra điều này sao cho chúng tôi thiết lập bối cảnh yêu cầu và đảm bảo rằng SaveItem() đã được gọi, nhưng theo cách thức mà SaveItem() thực sự không được gọi (vì A) nhà cung cấp cho SDB là một mô hình không được hydrat hóa hoàn toàn và có khả năng là bom và B) Tôi không muốn phải trả tiền cho giao dịch đó hàng trăm và hàng ngàn lần).

Khi xử lý các phương thức trả về giá trị, điều này là không đáng kể.

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo"); 

Trong trường hợp mà tôi phác thảo ở trên, mặc dù phương pháp của tôi "SaveItem()" là khoảng trống và do đó tùy chọn để sử dụng phương pháp Returns() Moq là không có sẵn. Và trong khi tôi có thể thiết lập một cuộc gọi lại để xác minh SaveItem() được gọi, tuy nhiên tôi có thể không làm cho nó không thực sự làm bất cứ điều gì.

Naive/hy vọng, tôi nghĩ sau đây sẽ làm việc, nhưng nó dường như vẫn gọi phương pháp:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())); 

Vậy câu hỏi triệu đô la: các Moq của mã giả sau đây là gì?

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE(); 
+0

Edited để làm rõ tình hình, kỳ thi này là cho một lớp học "kinh doanh" nổi xung quanh, không để thực hiện SimpleDB thực tế. Việc thực hiện SimpleDB được kiểm tra ở nơi khác, ở đây, đó là những gì tôi đang chế giễu. – bakasan

Trả lời

29

Nếu phương pháp SaveItem() là ảo hay trừu tượng, và bạn không thiết lập Callbase = true, sau đó phương pháp này nên được tái thực hiện để không làm gì cả bởi các mô hình.

Bạn sẽ có thể làm:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable(); 

... test here ... 

mockDb.Verify(); 
+0

Hoàn hảo! Hoàn toàn không có ý tưởng rằng đó là ý định của các công cụ Verifiable()/Verify(), và w/o tài liệu chính thức hơn, thậm chí sẽ không biết đọc trên các chủ đề và bài viết trong khu vực đó. Chỉ cần cho nó một xoáy và tôi đã có cả hai trường hợp thử nghiệm tích cực và tiêu cực đối với kịch bản này bây giờ. Cảm ơn nhiều! – bakasan

+2

+1; Ngoài ra, bạn cũng có thể xác minh tất cả các cuộc gọi của bạn bất kể cờ Verifiable() bằng cách gọi mockDb.VerifyAll() –

+0

Có thể cho câu trả lời này được mở rộng cho phương thức khác, tức là không ảo hay trừu tượng? – leon

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