2011-11-01 22 views
22

Tôi cần giả lập HttpResponseBase.ApplyAppPathModifier theo cách mà tham số ApplyAppPathModifier được gọi với tự động được trả lại bởi mô hình.Có thể vượt qua các giá trị tham số trong Moq không?

Tôi có đoạn mã sau:

var httpResponseBase = new Mock<HttpResponseBase>(); 
httpResponseBase.Setup(hrb => hrb.ApplyAppPathModifier(/*capture this param*/)) 
       .Returns(/*return it here*/); 

Bất kỳ ý tưởng?

EDIT:

Tìm thấy một giải pháp trên trang đầu tiên của tài liệu Moq (http://code.google.com/p/moq/wiki/QuickStart):

var httpResponseBase = new Mock<HttpResponseBase>(); 
httpResponseBase.Setup(hrb => hrb.ApplyAppPathModifier(It.IsAny<string>) 
       .Returns((string value) => value); 

Tôi đột nhiên cảm thấy rất nhiều ngu ngốc, nhưng tôi đoán đây là những gì sẽ xảy ra khi bạn viết mã tại 23:30

+1

Tôi đã có một nhu cầu để ném một trôi qua trong ' Đối số ngoại lệ. Tôi đã sử dụng phương thức 'Callback()' (thay vì 'Returns()') để ném nó. Chỉ vì hậu thế và đầy đủ. – gregsdennis

+0

@gregsdennis Tuyệt vời! Cảm ơn vì đăng. Không nhận thấy 'Callback()' trước đây - có lẽ nó đã được giới thiệu gần đây hơn. –

Trả lời

9

Sử dụng It:

It.Is<MyClass>(mc=>mc == myValue) 

Tại đây bạn có thể kiểm tra kỳ vọng: giá trị bạn mong đợi nhận được. Về mặt trả lại, chỉ cần trả lại giá trị bạn cần.

var tempS = string.Empty; 
var httpResponseBase = new Mock<HttpResponseBase>(); 
httpResponseBase.Setup(hrb => hrb.ApplyAppPathModifier(It.Is<String>(s=>{ 
      tempS = s; 
      return s == "value I expect"; 
      }))) 
       .Returns(tempS); 
+0

Cảm ơn @Aliostad. Chỉ cần tìm thấy câu trả lời giải pháp là tốt (đánh dấu của bạn là câu trả lời). Giải pháp là trên trang đầu tiên của tài liệu Moq. Tôi đột nhiên cảm thấy rất ngây thơ, nhưng tôi đoán đây là những gì sẽ xảy ra khi bạn viết mã lúc 23:30 ... –

23

Vâng, bạn có thể lặp lại các luận cứ truyền cho phương pháp

httpResponseBase.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())) 
       .Returns((string path) => path); 

Bạn cũng có thể nắm bắt được nó nếu bạn muốn

string capturedModifier = null; 

httpResponseBase.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())) 
       .Callback((string path) => capturedModifier = path); 
Các vấn đề liên quan