【问题标题】:Frozen Mock returns null but works fine inside Test methodFrozen Mock 返回 null 但在 Test 方法中工作正常
【发布时间】:2021-06-14 16:50:40
【问题描述】:

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

测试用例

[Theory]
[AutoStackoverFlowData]
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 AutoStackoverFlowData : AutoDataAttribute
{
    public AutoStackoverFlowData() : this(new AutoMoqCustomization()) { }

    public AutoStackoverFlowData(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);
}

【问题讨论】:

    标签: c# unit-testing moq autofixture


    【解决方案1】:

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

    [Theory]
    [AutoStackoverFlowData]
    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 2017-02-18
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多