如何在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);
我该如何填写???
,或者如果这不可能,那么我该如何返回泛型mock?
有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();
//...
尝试使用此Returns
过载:IReturnsResult<TMock> Returns(InvocationFunc valueFunction);
设置:
factory.Setup(m => m.Create<It.IsAnyType>())
.Returns(new InvocationFunc(invocation =>
{
var typeArgument = invocation.Method.GetGenericArguments()[0];
return Activator.CreateInstance(typeArgument);
});
呼叫:
var something = factory.Object.Create<Something>();