如何对不返回的异步函数进行单元测试?

问题描述 投票:0回答:1

我是单元测试新手,我正在尝试使用 NSubstitute 和 XUnit 为 MongoDB 中的 Add 和 Get 函数编写单元测试。我正在努力弄清楚如何测试 Add 函数,该函数没有返回值,仅将文档的 InsertOneAsync 插入数据库。

这是我正在尝试测试的存储库类。

public class SampleRepository : ISampleRepository
{
    private readonly IMongoCollection<SampleSet> _sampleSetCollection;

    public SamplesRepository(IMongoCollection<SampleSet> sampleSetCollection)
    {
        _sampleSetCollection = sampleSetCollection;
    }

    public async Task<SampleSet?> GetSampleSetAsync(string sampleType)
    {
        if (string.IsNullOrWhiteSpace(sampleType))
        {
            return null;
        }

        var filter = Builders<SampleSet>.Filter.Eq(nameof(SampleSet.SampleType), sampleType);
        return await _sampleSetCollection
            .Find(filter)
            .FirstOrDefaultAsync();
    }

    public async Task AddSampleSetAsync(SampleSet sampleSet)
    {
        await _sampleSetCollection.InsertOneAsync(sampleSet);
    }
}

}

这是我陷入困境的单元测试

public class SamplesRepositoriesTests
{
    private readonly IMongoCollection<SampleSet> _mongoCollection = Substitute.For<IMongoCollection<SampleSet>>();
    private ISamplesRepository _samplesRepository;

    public SamplesRepositoriesTests()
    {
        var services = new ServiceCollection();
        services.AddTransient(sp => _mongoCollection);

        var provider = services.BuildServiceProvider();
        _mongoCollection = provider.GetRequiredService<IMongoCollection<SampleSet>>();
    }
      
  public async Task AddSampleSetAsync_ValidSampleSet()
 {
var samples = new List<Sample> { new Sample("test", "{\"test\":\"test\"}") };
var expected = new SampleSet("test", samples, "test", DateTime.UtcNow);  _mongoCollection.InsertOneAsync(expected).Returns(Task.CompletedTask);
        var samplesRepository = new SamplesRepository(_mongoCollection);

        await samplesRepository.AddSampleSetAsync(expected);

        Assert.Equal(_mongoCollection.InsertOneAsync(expected).Returns(Task.CompletedTask), await samplesRepository.AddSampleSetAsync(expected));
    }

    [Fact]
    public async Task AddSampleSetAsync_InValidSampleSet()
    {
        var samples = new List<Sample> { };
        var testSampleSet = new SampleSet("test", samples, "test", DateTime.UtcNow);

        _samplerulesRepository = new SamplesRepository(_mongoCollection);

    }
}

}

c# unit-testing xunit nsubstitute
1个回答
0
投票

我认为根本没有必要对存储库进行单元测试。基本上测试存储库没有意义。

相反,您可能想测试使用您的存储库的服务。 为了测试调用服务的虚构 Add 方法插入传递的数据,您将需要使用某种内存存储库。 所以你的测试逻辑是:

  1. 创建一个服务(不是模拟)
  2. 注入内存存储库/dbcontext(不是模拟)
  3. 测试/断言调用服务的 Add 方法会将实体保存在上下文/集合/其他内容中
© www.soinside.com 2019 - 2024. All rights reserved.