我有一个接口上的方法:
string DoSomething(string whatever);
我想用MOQ模拟这个,这样它就会返回传入的任何东西-类似于:
_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
.Returns( [the parameter that was passed] ) ;
什么好主意吗?
我有一个接口上的方法:
string DoSomething(string whatever);
我想用MOQ模拟这个,这样它就会返回传入的任何东西-类似于:
_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
.Returns( [the parameter that was passed] ) ;
什么好主意吗?
当前回答
泛型Returns<T>方法可以很好地处理这种情况。
_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);
或者如果该方法需要多个输入,则如下所示:
_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
其他回答
对于那些不使用Moq的人,有一种方法可以使用NSubstitute。
mock.Method(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).Returns(callInfo =>
{
var arg1 = callInfo[0].ToString();
var arg2 = callInfo[1].ToString();
var argN = callInfo[n-1].ToString();
return arg1 + arg2 + argN; //or whatever
});
更有用的是,如果你有多个参数,你可以访问它们中的任何/所有:
_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
.Returns((string a, string b, string c) => string.Concat(a,b,c));
您总是需要引用所有的参数,以匹配方法的签名,即使您只打算使用其中一个。
泛型Returns<T>方法可以很好地处理这种情况。
_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);
或者如果该方法需要多个输入,则如下所示:
_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
你可以使用带有输入参数的lambda,如下所示:
.Returns((string myval) => { return myval; });
或者可读性稍强:
.Returns<string>(x => x);