gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:55:39 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com