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");
- 1. Thiết lập Moq để bỏ qua một phương thức ảo
- 2. PyUnit: dừng sau lần kiểm tra thất bại đầu tiên?
- 3. Gói các khối thất bại thành công từ AFNetworking trong một phương thức
- 4. Thiết lập moq và xác minh rằng phương thức được gọi là
- 5. Làm thế nào để thiết lập một phương pháp hai lần cho các tham số khác nhau với giả
- 6. PHPUnit: nhận đối số cho một phương thức giả gọi
- 7. thoại đầu tiên sau khi chứng thực thất bại ngay lập tức và đóng hộp thoại
- 8. Rails chuyển hướng thất bại trên nginx & unicorn thiết lập
- 9. Moq để thiết lập một chức năng trở lại dựa trên thời gian gọi là
- 10. Thông báo xác nhận: giả sử thất bại hoặc giả định thành công
- 11. Xác minh phương thức được gọi là
- 12. MOQ - thiết lập một phương pháp dựa trên các giá trị tham số (nhiều lý lẽ)
- 13. Làm thế nào để sửa đổi một tham số yêu cầu của một phương pháp giả lập với Moq?
- 14. git clone thất bại với "index-pack" không thành công?
- 15. Làm thế nào để thất bại trên
- 16. Sử dụng Moq để giả lập Constructor?
- 17. Các khối thành công/thất bại AFNetworking được gọi trên luồng chính?
- 18. Cập nhật JSF Ajax khiến commandLink thất bại tại lần nhấp đầu tiên
- 19. jQuery.ajax() callbacks thành công/thất bại được gọi là khi nào?
- 20. HttpUrlConnection.openConnection thất bại lần thứ hai
- 21. Moq một phương pháp void
- 22. Tham số Moq và Xác minh Mảng/IEnumerable trong thiết lập phương pháp
- 23. Ajax cuộc gọi thất bại trong Django
- 24. Cách sử dụng thư viện MOQ để giả lập ENum
- 25. Gọi exe từ PowerShell và nhận phản hồi về thành công hay thất bại
- 26. Giả lập phương thức tĩnh nhiều lần bằng JMockit trong thử nghiệm JUnit
- 27. PhoneGap Android Plugin: Thành công & Thất bại Gọi lại không được gọi là
- 28. PowerMock, giả lập một phương thức tĩnh, THEN gọi phương thức thực trên tất cả các số liệu thống kê khác
- 29. gọi lambda @classmethod thất bại
- 30. Làm thế nào để giả lập một phương thức với các đối số chức năng trong Scala?
Moq 4.2 & cao hơn bây giờ hỗ trợ này qua 'SetupSequence() '. –