2013-01-16 31 views
18

Tôi cần phải giả một giao diện để gọi đến MSMQ, có cách nào tôi có thể sử dụng Moq để mô phỏng kịch bản MSMQ thực có 10 tin nhắn trong hàng đợi, tôi gọi mocked chức năng 10 lần và tôi có thể nhận được một đối tượng được xác định trước, vào lần thứ 11 tôi sẽ nhận được một giá trị trả về khác (ví dụ null)?Moq để thiết lập một chức năng trở lại dựa trên thời gian gọi là

Trả lời

22

Moq hiện nay có một phương pháp mở rộng gọi SetupSequence() trong không gian tên Moq có nghĩa là bạn có thể xác định một giá trị trả về khác biệt cho mỗi cuộc gọi cụ thể.

Ý tưởng chung là bạn chỉ cần chuỗi giá trị trả lại bạn cần. Trong ví dụ dưới đây cuộc gọi đầu tiên sẽ trở lại Joe và cuộc gọi thứ hai sẽ trở lại Jane:

customerService 
.SetupSequence(s => s.GetCustomerName(It.IsAny<int>())) 
.Returns("Joe") //first call 
.Returns("Jane"); //second call 

Một số biết thêm here.

+0

Điều này thực sự là những gì tôi đang tìm kiếm :) tuyệt vời. – Silwing

+0

Điều đó thậm chí còn tốt hơn! – hardywang

+0

Có vẻ như liên kết không liên quan:/ – reddy

12

đôi khi tôi sử dụng một bộ đếm đơn giản cho các kịch bản như:

int callCounter = 0; 
var mock = new Mock<IWhatever>(); 
mock 
    .Setup(mock => mock.SomeMethod()) 
    .Returns(() => 
    { 
     if (callCounter++ < 10) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else 
     } 
    }); 
+2

Giải pháp tốt. Cũng có thể nối thêm '.CallBack (...)' vào đó dấu ba chấm đại diện cho đại biểu thay đổi 'callCounter' và có thể là trạng thái khác. –

+0

Đây thực sự là một ý tưởng rất tuyệt vời. – hardywang

2

Bạn cũng có thể thiết lập một chức năng riêng để thực hiện việc này. Bạn thậm chí có thể chuyển hàm tham số nếu bạn muốn:

_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param)); 
Các vấn đề liên quan