Moq-设置一般退货类型



如何在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>();

最新更新