我有一个带有如下方法的接口:

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.
}

测试对象的某些方法可能会为三个或四个不同类型调用保留.如果我必须设置所有类型,我必须 for each 测试编写大量设置代码.但是在一个测试中,我并不关心所有这些对象,我只需要非空的模拟对象,除了我实际测试的那个对象(我很乐意为它编写一个更复杂的设置).

推荐答案

除非我误解了您的需求,否则您可以构建如下方法:

private Mock<IRepo> MockObject<T>()
{
    var mock = new Mock<IRepo>();
    return mock.Setup(pa => pa.Reserve<T>())
        .Returns(new Mock<IA<T>>().Object).Object;
}

.net相关问答推荐

Long.MaxValue从Single到Long的转换导致溢出异常

.NET模拟具有泛型返回类型的方法

从窗体中移除另一个控件中引用的控件时获取设计时通知

EF Core IEntityTypeConfigurations:从数据库提取数据后相关对象为空

无法在 Blazor Server 应用程序中触发 InputRadio 的 onchange 事件

Visual Studio 2022 中的目标操作系统和目标运行时有什么区别?

.Net MAUI Android 无法与 API localhost 对话

如何确定计时器是否正在运行?

代码访问安全是否在任何现实世界中使用?

单线程单元 - 无法实例化 ActiveX 控件

我在哪里可以获得线程安全的 CollectionView?

如何从标头中检索基本身份验证凭据?

C#:内存不足异常

如何结合 ||条件语句中的运算符

react 式扩展使用的好例子

判断 .NET 中的目录和文件写入权限

MailMessage,Sender 和 From 属性的区别

是 C# 中的 bool 读/写原子

Windows 服务在哪个目录中运行?

有没有一种简单的方法来判断 .NET Framework 版本?