是否可以在Moq中传递参数值?

时间:2011-11-01 23:19:59

标签: c# testing mocking moq

我需要以这样的方式模拟HttpResponseBase.ApplyAppPathModifier,模拟会自动返回调用参数ApplyAppPathModifier

我有以下代码:

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

有什么想法吗?

修改

在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);

我突然觉得很愚蠢,但我猜这是你在23:30写代码时会发生什么

2 个答案:

答案 0 :(得分:28)

是的,您可以回显传递给方法的参数

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

如果需要,您也可以捕获它

string capturedModifier = null;

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

答案 1 :(得分:10)

使用It

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

在这里,您可以检查期望:您希望收到的价值。 就回报而言,只需返回您需要的价值。

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);