我有一个接口(interface),方法如下:
public interface IRepo
{
IA<T> Reserve<T>();
}
我想模拟包含此方法的类,而不必为它可能用于的每个类型指定设置方法。理想情况下,我只是希望它返回 new mock<T>.Object
.
我如何实现这一目标?
看来我的解释不清楚。这是一个示例 - 当我指定 T(此处为字符串)时,这现在是可能的:
[TestMethod]
public void ExampleTest()
{
var mock = new Mock<IRepo>();
mock.Setup(pa => pa.Reserve<string>()).Returns(new Mock<IA<string>>().Object);
}
我想实现的是这样的:
[TestMethod]
public void ExampleTest()
{
var mock = new Mock<IRepo>();
mock.Setup(pa => pa.Reserve<T>()).Returns(new Mock<IA<T>>().Object);
// of course T doesn't exist here. But I would like to specify all types
// without having to repeat the .Setup(...) line for each of them.
}
被测对象的一些方法可能会调用三四种不同类型的reserve。如果我必须设置所有类型,我必须为每个测试编写大量设置代码。但在单个测试中,我并不关心所有这些,我只需要非 null 模拟对象,除了我实际测试的对象(我很乐意为此编写更复杂的设置)。
最佳答案
在 Moq 4.13 中,他们引入了 It.IsAnyType 类型,您可以使用它来模拟泛型方法。例如
public interface IFoo
{
bool M1<T>();
bool M2<T>(T arg);
}
var mock = new Mock<IFoo>();
// matches any type argument:
mock.Setup(m => m.M1<It.IsAnyType>()).Returns(true);
// matches only type arguments that are subtypes of / implement T:
mock.Setup(m => m.M1<It.IsSubtype<T>>()).Returns(true);
// use of type matchers is allowed in the argument list:
mock.Setup(m => m.M2(It.IsAny<It.IsAnyType>())).Returns(true);
mock.Setup(m => m.M2(It.IsAny<It.IsSubtype<T>>())).Returns(true);
关于c# - 在不指定 T 的情况下模拟 Moq 中的泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20072429/