Cách ngắn gọn nhất để sử dụng Moq để mô phỏng một phương thức sẽ ném ngoại lệ lần đầu tiên được gọi, sau đó thành công lần thứ hai được gọi là?Moq: Thiết lập một phương thức giả để thất bại trong lần gọi đầu tiên, thành công trên số
Trả lời
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();
}
đâ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
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
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
Đ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 Đó 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
Rực rỡ. Nó hiệu quả tuyệt vời đối với tôi. –
Đẹp nhất, tôi không nghĩ về điều này! –
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ệ.
đọc thú vị, cảm ơn. – anthony
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");
Moq 4.2 & cao hơn bây giờ hỗ trợ này qua 'SetupSequence() '. –