问题描述
如何在 Moq 中设置通用返回类型?
我有以下界面:
public interface IFoo
{
T Bar<T>();
}
现在我想设置 Bar<T>()
以在测试中工作
var foo = new Mock<IFoo>();
foo.Setup(x => x.Bar<It.IsAnyType>()).Returns(new Mock<???>().Object);
我如何填写 ???
,或者如果不可能,那么我如何返回一个通用模拟?
有 100 多种类型,我尽量避免嘲笑它们。 如果调用为任何类型返回 null,则测试中断(因为代码抛出和异常),遗憾的是,这是默认的非模拟行为。
解决方法
如果 T
是引用类型,即
public interface IFoo {
T Bar<T>() where T : class;
}
那么创建一个纤薄的模型会更容易
public class MockFoo : IFoo {
private MockFoo() {
}
public T Bar<T>() where T : class => Mock.Of<T>();
public static IFoo New() => new MockFoo();
}
可以在安排测试时初始化并使用 MOQ 来模拟 Bar
的输出
//Arrange
IFoo foo = MockFoo.New();
//...