2013-02-25 47 views
8

Xin chào Tôi là người mới đến thử nghiệm Moq và có thời gian khó khăn để thực hiện một xác nhận đơn giản. Tôi đang sử dụng một giao diệnPhương thức void kiểm tra Moq

public interface IAdd 
{ 
    void add(int a, int b); 
} 

Moq cho giao diện IAdd là:

Mock<IAdd> mockadd = new Mock<IAdd>(); 
    mockadd.Setup(x => x.add(It.IsAny<int>(), It.IsAny<int>()).callback((int a, int b) => { a+b;}); 
    IAdd testing = mockadd.Object; 

Kể từ khi phương pháp add là vô hiệu, nó không trả lại bất kỳ giá trị cho Khẳng định với. Làm thế nào tôi có thể khẳng định thiết lập này?

+2

Bạn đang cố gắng kiểm tra điều gì? – GolfWolf

+0

Tôi đang thử kiểm tra phương thức bổ sung đó nhưng không có bất kỳ kiểu trả về nào. Nếu nó có int là kiểu trả về, tôi sẽ kiểm tra Assert.AreEqual (mockadd.add (2,2), 4); Nhưng không có kiểu trả về thì làm cách nào để kiểm tra phương thức thêm. –

+2

** 1. ** Không có ý nghĩa gì khi kiểm tra giao diện (hoặc triển khai mô hình). ** 2. ** Nếu bạn có một lớp tính toán một cái gì đó, bạn có thể muốn làm cho kết quả có sẵn bằng cách nào đó (hoặc thông qua giá trị trả lại hoặc một số tài sản trên đối tượng đó) – GolfWolf

Trả lời

14

Tốt hơn để cung cấp bối cảnh nhiều hơn, nhưng thông thường nó được sử dụng như thế này:

var mockAdd = new Mock<IAdd>(); 
mockAdd.Setup(x => x.Add(1, 2)).Verifiable(); 

//do something here what is using mockAdd.Add 

mockAdd.VerifyAll(); 
+0

Pavel, bạn có thể giải thích thêm một chút về // làm điều gì đó ở đây những gì đang sử dụng mockAdd.Add. Tôi đang mắc kẹt trên một vấn đề tương tự và không chắc chắn những gì để thêm vào "// làm điều gì đó ở đây những gì đang sử dụng mockAdd.Add" – Maddy

18

Tại sao mocking được sử dụng? Nó được sử dụng để xác minh rằng SUT (hệ thống đang thử nghiệm) tương tác chính xác với các phụ thuộc của nó (cần được mô phỏng). Tương tác đúng nghĩa là gọi các thành viên phụ thuộc chính xác với các thông số chính xác.

Bạn nên không bao giờ khẳng định về giá trị được trả về bởi mô hình. Đó là giá trị giả không có liên quan đến mã sản xuất. Giá trị duy nhất bạn nên xác nhận là giá trị được SUT trả lại. SUT là điều duy nhất bạn nên viết xác nhận.

Ngoài ra, bạn nên không bao giờ thử nghiệm giao diện. Bởi vì không có gì để kiểm tra. Giao diện chỉ là mô tả API. Nó không có triển khai. Vì vậy, hãy dừng lại và nghĩ về mã nào bạn đang thử nghiệm ở đây? Đây có phải là mã thực, được thực thi trong ứng dụng của bạn không?

Vì vậy, bạn chỉ nên giả chế giao diện IAdd cho đối tượng thử nghiệm sử dụng giao diện IAdd.

+0

Hi Sergey, tôi mới về thử nghiệm mô hình này. Tôi muốn tránh phương pháp void để thực hiện, phương pháp cập nhật cơ sở dữ liệu, là theer một cách tốt hơn để làm như vậy? –

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