.net Moq -设置通用返回类型

ej83mcc0  于 2023-01-06  发布在  .NET
关注(0)|答案(2)|浏览(130)

如何在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,测试就会中断(因为代码抛出异常),这是默认的非模仿行为。

2eafrhcq

2eafrhcq1#

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

//...
bxjv4tth

bxjv4tth2#

尝试使用此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>();

相关问题