我有一个接口,其方法如下:
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.
}
被测对象的某些方法可能会调用三种或四种不同类型的保留。如果我必须设置所有类型,我必须为每个测试编写大量设置代码。但在单个测试中,我并不关心所有这些,我只需要非空模拟对象,除了我实际测试的对象(我很乐意为此编写一个更复杂的设置)。
在起订量 4.13 中It.IsAnyType and It.IsSubtype<T>类型被引入 https://github.com/Moq/moq4/wiki/Quickstart#matching-generic-type-arguments,您可以使用它来模拟泛型方法。例如。:
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);
请注意,这不适用于以下方法return一个通用的,原因在这里解释 https://github.com/moq/moq4/issues/1220#issuecomment-1019537444。还讨论了可能的解决方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)