首先,有关我的开发环境的一些信息:
我尝试模拟一个需要一些字符串参数的函数,我想使用它It.IsAny<string>()进行设置。通常我会这样:
using ( AutoMock mock = AutoMock.GetLoose() ) {
mock.Mock<SomeInterface>()
.Setup( x => x.someFunction(
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<string>() ) );
//...
}
Run Code Online (Sandbox Code Playgroud)
但是现在我想调用一个进行设置的功能,因此我不必复制粘贴上面的代码并使我的单元测试稍微“好看”。我想象这样的事情:
using ( AutoMock mock = AutoMock.GetLoose() ) {
UnknownType anyString = It.IsAny<string>();
setup( mock, anyString );
//...
}
void setup( Automock mock, UnknownType anyString ){
mock.Mock<SomeInterface>()
.Setup( x => x.someFunction( anyString, anyString, anyString ) );
}
Run Code Online (Sandbox Code Playgroud)
有人知道解决方案吗?我当我使用string甚至var为未知类型的变量anyString保持的值null之后UnknownType anyString = It.IsAny<string>();。预先感谢您的回答。
进一步说明:
我需要为每个参数指定不同的值。所以它可能看起来像这样:
using ( AutoMock mock = AutoMock.GetLoose() ) {
UnknownType string1 = It.IsAny<string>;
UnknownType string2 = It.Is<string>( s => s.Equals( "Specific string" ) );
UnknownType string3 = It.IsAny<string>;
setup( mock, string1, string2, string3 );
//...
}
private static void setup( AutoMock mock,
UnknownType string1, UnknownType string2, UnknownType string3 ) {
mock.Mock<SomeInterface>().Setup( x => x.someFunction( string1, string2, string3 ) );
}
Run Code Online (Sandbox Code Playgroud)
It.*旨在用作Setup表达式参数,而不是作为参数/变量传递,因为默认情况下它们返回null。
据我所知,您所要求的似乎不可能。
通过使用泛型,我能想到的最接近的事情是创建一个扩展方法来作用于自动模拟,该模拟采用所需的表达式进行模拟
public static class AutomockExtension {
public static Moq.Language.Flow.ISetup<T> Setup<T>(this Automock mock, Expression<Action<T>> expression) where T : class {
return mock.Mock<T>().Setup(expression);
}
public static Moq.Language.Flow.ISetup<T, TValue> Setup<T, TValue>(this Automock mock, Expression<Func<T, TValue>> expression) where T : class {
return mock.Mock<T>().Setup(expression);
}
}
Run Code Online (Sandbox Code Playgroud)
这确实不会为您节省太多术语或重复代码,因为您仍然需要It.*在表达式中调用
using ( AutoMock mock = AutoMock.GetLoose() ) {
mock.Setup<SomeInterface>(_ =>
_.someFunction(
It.IsAny<string>(),
It.Is<string>( s => s.Equals( "Specific string" ),
It.IsAny<string>()
)
);
//...
}
Run Code Online (Sandbox Code Playgroud)
原答案
使用泛型
void setup<T>(Automock mock){
mock.Mock<SomeInterface>()
.Setup(_ => _.someFunction(
It.IsAny<T>(),
It.IsAny<T>(),
It.IsAny<T>()));
}
Run Code Online (Sandbox Code Playgroud)
然后您可以根据需要调用设置,例如
using ( AutoMock mock = AutoMock.GetLoose() ) {
setup<string>(mock);
//...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |