这是我第一次编写单元测试,我只是有几个问题。我在内存数据库中使用来测试我的服务,我想知道我是否正确地做了。我的第一个问题是我的所有服务电话都需要多个断言吗?我需要断言InsertProduct
吗?第二,我是否因为在每次服务呼叫中使用新的上下文实例而过度测试?
[Fact]
public void ProductService_DeleteProduct_Test()
{
// arrange
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(databaseName: "ProductService_DeleteProduct_Test")
.Options;
var product = new Product() { Id = Guid.NewGuid(), Name = "Product"};
// act
// insert
using (var context = new ApplicationDbContext(options))
{
var service = new Service(context);
service.ProductService.InsertProduct(product);
}
// delete
using (var context = new ApplicationDbContext(options))
{
var service = new Service(context);
service.ProductService.DeleteProducts(new List<Guid> { product.Id });
}
// assert
using (var context = new ApplicationDbContext(options))
{
var service = new Service(context);
Assert.Equal(0, service.ProductService.GetAllProducts().Count);
}
}
答案 0 :(得分:1)
回答你的第一个问题,我会拒绝。由于这是一个单元测试,你正在测试删除。我认为设置的插入部分是因为您将系统置于要测试删除的状态。至于Zoran Horvat的观点,如果可以,可以通过服务本身以外的其他方式在数据库中添加一行。
要回答你的第二个问题,似乎没有必要使用三个使用块来提升服务三次。我将insert,delete和assert放在同一个使用中,利用SUT的一个实例或服务。
但是,如果您有多个测试都需要在数据库中有一行,请考虑将插入移动到SetUp方法中,并使用[SetUp]属性,每个测试都可以预先调用。在这种情况下,您将使用上下文的多个实例。