我需要多个断言吗? xUnit测试

时间:2016-12-04 00:27:21

标签: c# unit-testing xunit in-memory-database

这是我第一次编写单元测试,我只是有几个问题。我在内存数据库中使用来测试我的服务,我想知道我是否正确地做了。我的第一个问题是我的所有服务电话都需要多个断言吗?我需要断言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);
    }
}

1 个答案:

答案 0 :(得分:1)

回答你的第一个问题,我会拒绝。由于这是一个单元测试,你正在测试删除。我认为设置的插入部分是因为您将系统置于要测试删除的状态。至于Zoran Horvat的观点,如果可以,可以通过服务本身以外的其他方式在数据库中添加一行。

要回答你的第二个问题,似乎没有必要使用三个使用块来提升服务三次。我将insert,delete和assert放在同一个使用中,利用SUT的一个实例或服务。

但是,如果您有多个测试都需要在数据库中有一行,请考虑将插入移动到SetUp方法中,并使用[SetUp]属性,每个测试都可以预先调用。在这种情况下,您将使用上下文的多个实例。