2011-08-12 27 views

Trả lời

39

tôi sẽ tận dụng Callback và tăng số đếm để xác định có hay không để ném một ngoại lệ từ Callback.

[Test] 
public void TestMe() 
{ 
    var count = 0; 
    var mock = new Mock<IMyClass>(); 
    mock.Setup(a => a.MyMethod()).Callback(() => 
     { 
      count++; 
      if(count == 1) 
       throw new ApplicationException(); 
     }); 
    Assert.Throws(typeof(ApplicationException),() => mock.Object.MyMethod()); 
    Assert.DoesNotThrow(() => mock.Object.MyMethod()); 
} 

public interface IMyClass 
{ 
    void MyMethod(); 
} 
+0

đây là câu trả lời hay và cách tiếp cận này trở nên thích hợp hơn khi bạn muốn hơn 2 điều xảy ra. – anthony

+0

Cách tiếp cận này rất đơn giản, nhưng hãy kiểm tra bài đăng của Phil Haack từ câu trả lời @Mathias. Nó khá trơn. Sử dụng một phương thức mở rộng bạn có thể làm một cái gì đó như 'reader.Setup (r => r.Read()). ReturnsInOrder (true, true, false);' – rsbarro

+3

ReturnsInOrder() là tốt đẹp nếu bạn muốn trả về một chuỗi các giá trị nhưng nó không phải là dễ dàng rõ ràng làm thế nào để sử dụng nó để ném một ngoại lệ như là một phần của chuỗi. – anthony

16

Điều tốt nhất mà tôi đã đưa ra cho đến nay là thế này:

interface IFoo 
{ 
    void Bar(); 
} 

[Test] 
public void TestBarExceptionThenSuccess() 
{ 
    var repository = new MockRepository(MockBehavior.Default); 
    var mock = repository.Create<IFoo>(); 

    mock.Setup(m => m.Bar()). 
     Callback(() => mock.Setup(m => m.Bar())). // Setup() replaces the initial one 
     Throws<Exception>();      // throw an exception the first time 

    ... 
} 
+1

+1 Đó là một cách tiếp cận thú vị. Chỉ có thể không được rõ ràng cho ai đó vấp vào mã những gì đang xảy ra ở đó. – rsbarro

+3

Rực rỡ. Nó hiệu quả tuyệt vời đối với tôi. –

+0

Đẹp nhất, tôi không nghĩ về điều này! –

5

Phil Haack có một thú vị blog post khi thiết lập phương thức trả về một chuỗi kết quả cụ thể. Dường như nó sẽ là một điểm khởi đầu tốt, với một số công việc liên quan, bởi vì thay vì một dãy các giá trị của một kiểu nhất định, bạn cần có một chuỗi các kết quả có thể thuộc kiểu T, hoặc một ngoại lệ.

+0

đọc thú vị, cảm ơn. – anthony

3

Bắt đầu với Moq 4.2, bạn chỉ có thể sử dụng phương thức tích hợp SetupSequence() (như đã nêu trong bình luận @RichardBarnett).

Ví dụ:

var mock = new Mock<IMyClass>(); 
mock.SetupSequence(x => x.MyMethod("param1")) 
    .Throws<MyException>() 
    .Returns("test return"); 
Các vấn đề liên quan