Frozen Mock returns null 但在测试方法中工作正常

Frozen Mock returns null but works fine inside Test method

我正在尝试测试一项服务,该服务利用提供程序从数据库中获取一些值并在返回一些值之前在服务内部使用它。 调试测试时,模拟提供程序工作正常。但是当 运行 完整测试时,提供者总是 returns null.

测试用例

[Theory]
[AutoWhosebugData]
public async Task TestingService(Service sut, [Frozen] Mock<IProvider> providerMock)
{
    providerMock.Setup(x => x.GetGreeting(It.IsAny<int>())).ReturnsAsync("Hello Developer");
    var s = providerMock.Object.GetGreeting(123); //works returns "Hello Developer"
    var greeting = sut.SayHello();
    Assert.Equal(greeting, "Hello Developer");
}

public class AutoWhosebugData : AutoDataAttribute
{
    public AutoWhosebugData() : this(new AutoMoqCustomization()) { }

    public AutoWhosebugData(params ICustomization[] customization)
            : base(() => new Fixture().Customize(new AutoMoqCustomization())) { }
}

服务

public class Service
{
    private readonly IProvider provider
    public Service(IProvider provider)
    {
        this.provider= provider;
    }

    public async Task<string> SayHello()
    {
        int someNum= 123;
        var temp = await subProvider.GetGreeting(someNum);
        return temp;
    }
}

界面

public interface IProvider
{
    Task<string> GetGreeting(int id);
}

使用[冰雪奇缘]时顺序很重要。始终将 [Frozen] 变量作为测试用例中的第一个参数。这是一个简单的修复:

[Theory]
[AutoWhosebugData]
public async Task TestingService([Frozen] Mock<IProvider> providerMock, Service sut)
{
    providerMock.Setup(x => x.GetGreeting(It.IsAny<int>())).ReturnsAsync("Hello Developer");
    var s = providerMock.Object.GetGreeting(123);
    var greeting = await sut.SayHello();
    Assert.Equal("Hello Developer", greeting);
}