我是单元测试新手,我正在尝试使用 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);
}
}
}
我认为根本没有必要对存储库进行单元测试。基本上测试存储库没有意义。
相反,您可能想测试使用您的存储库的服务。 为了测试调用服务的虚构 Add 方法插入传递的数据,您将需要使用某种内存存储库。 所以你的测试逻辑是: