2012-02-03 32 views
57

Tôi khá mới để thử nghiệm đơn vị trong C# và học cách sử dụng Moq. Dưới đây là lớp mà tôi đang cố gắng kiểm tra.Xác minh cuộc gọi phương thức bằng cách sử dụng Moq

class MyClass 
{ 
    SomeClass someClass; 
    public MyClass(SomeClass someClass) 
    { 
     this.someClass = someClass;  
    } 

    public void MyMethod(string method) 
    { 
     method = "test" 
     someClass.DoSomething(method); 
    } 
} 

class Someclass 
{ 
    public DoSomething(string method) 
    { 
     // do something... 
    } 
} 

Dưới đây là TestClass tôi:

class MyClassTest 
{ 
    [TestMethod()] 
    public void MyMethodTest() 
    { 
     string action="test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 
     mockSomeClass.SetUp(a => a.DoSomething(action)); 
     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 
     mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>())); 
    } 
} 

tôi nhận được ngoại lệ sau đây:

Expected invocation on the mock at least once, but was never performed 
No setups configured. 
No invocations performed.. 

Tôi chỉ muốn xác minh nếu phương pháp "MyMethod" đang được gọi hay không. Tui bỏ lỡ điều gì vậy?

Cảm ơn trước!

+1

Điều đó sẽ không biên dịch nếu 'SomeClass' không có định nghĩa cho' MyMethod (chuỗi) ', có vẻ như không. –

+0

xin lỗi .. Tôi đã chỉnh sửa câu hỏi của tôi .. – user591410

+1

Bạn đang đi đúng hướng, nhưng có lỗi trong mã được đăng. Nó sẽ không biên dịch - vỏ trên Someclass, trả về void trên DoSomething. Sau đó bạn cần truy cập công cộng, sau đó làm cho DoSomething ảo. Trong ngắn hạn, bạn có thể có một lỗi trong mã sản xuất của bạn quá. – TrueWill

Trả lời

81

Bạn đang kiểm tra phương pháp sai. Moq yêu cầu bạn thiết lập (và sau đó tùy chọn xác minh) phương thức trong lớp phụ thuộc.

Bạn nên làm một cái gì đó như thế này:

class MyClassTest 
{ 
    [TestMethod] 
    public void MyMethodTest() 
    { 
     string action = "test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 

     mockSomeClass.Setup(mock => mock.DoSomething()); 

     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 

     // Explicitly verify each expectation... 
     mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once()); 

     // ...or verify everything. 
     // mockSomeClass.VerifyAll(); 
    } 
} 

Nói cách khác, bạn đang xác minh rằng gọi MyClass#MyMethod, lớp học của bạn chắc chắn sẽ gọi SomeClass#DoSomething một lần trong quá trình đó. Lưu ý rằng bạn không cần đối số Times; Tôi chỉ thể hiện giá trị của nó.

+0

Xin lỗi, tôi đã chỉnh sửa câu hỏi của mình bằng đúng phương pháp. Như bạn đã đề cập, tôi đã thử Cài đặt trước rồi thực hiện Xác minh. Nó vẫn mang lại cho tôi ngoại lệ tương tự. – user591410

+0

Tôi đã cập nhật câu hỏi của mình với các đề xuất mà bạn đã thực hiện, nhưng ngay cả điều này cũng mang lại cho tôi ngoại lệ tương tự .. Vui lòng thông báo. – user591410

+0

Có nó .. Cảm ơn .. Tôi đã thiết lập các đối số của phương pháp sai trong khi thiết lập nó lên. – user591410

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