c# - 在不指定 T 的情况下模拟 Moq 中的泛型方法

标签 c# .net generics mocking moq

我有一个接口(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/

相关文章:

c# - 为 DI 容器创建线程安全的单例包装器

c# - 如何从 .NET 核心 C# 项目中调试并进入 native 代码项目?

c# - 转换为 ASPNET Core 3.1 后 MVC 找不到 View

c# - 可轻松与 C# 和 .NET 一起使用的 winforms 替代品

Java 泛型 : why is this output possible?

c# - Entity Framework 4

c# - StaTaskScheduler和STA线程消息泵送

c# - 集合被修改;枚举操作可能不会在选择期间执行

具有泛型类型的 C# 属性

c# - 具有泛型类型参数的对象初始值设定项