C# 如何编写针对数据库的集成测试

C# 如何编写针对数据库的集成测试,c#,.net,unit-testing,integration-testing,C#,.net,Unit Testing,Integration Testing,假设我有一门课,如下所示 我不确定如何针对它编写单元/集成测试。它需要重构吗 是否只是添加一个add/Find方法(实际上是这样),在测试中调用add,然后调用Delete,然后调用Find public class Repository { public void DeleteProduct(int id) { var connstring = ""; //Get from web.config using(SqlConnection conn

假设我有一门课,如下所示

我不确定如何针对它编写单元/集成测试。它需要重构吗

是否只是添加一个add/Find方法(实际上是这样),在测试中调用add,然后调用Delete,然后调用Find

public class Repository
{
    public void DeleteProduct(int id)
    {
        var connstring = ""; //Get from web.config
        using(SqlConnection conn = new SqlConnection(connstring))
        {
            conn.Open();
            SqlCommand command = new SqlCommand("DELETE FROM PRODUCTS WHERE ID = @ID")
            command.Paramaters.Add("@ID", id)
            command.ExecuteNonQuery();
        }
    }
}

黄金法则是不要测试Framework的代码。除非此方法没有自定义逻辑,否则没有什么可测试的。 我认为您试图实现的是分离存储库,以简化单元测试。最好的方法是为存储库创建接口并模拟它。
如果你真的想创建一些集成测试,那么你必须创建一些测试数据库,在那里你可以进行核弹实验。

我从来没有为数据库调用添加过单元测试。这绝对是一个集成测试。没有可观察到的东西可供你检查

我知道Java在JUnit中安装了一些用于此目的的工具。它要求您编写模拟前后的XML文件,然后将表的内容与XML文件进行比较。我相信.Net也会有类似的功能。然而,我不确定这是否值得。我发现这些测试非常脆弱,没有什么价值


我建议采取务实的方法,不要为数据库对象编写测试。而是测试那些与数据库对象交互的对象。

我的建议-为存储库编写一个集成测试(因为您使用的是一个数据访问框架),除非存储库中有不止一个CRUD

Add/Find都是单独的存储库方法,它们需要自己进行测试

我建议您使用
Setup
设置种子数据,您知道可以对其进行操作。在这种情况下,将记录插入
产品
表中

然后执行:调用
Repository.Deleteproduct()

断言:已删除在安装程序中创建的产品(再次查询数据库以进行检查)


如果您使用的是ORM,此测试还将测试您的产品映射。

我想向您指出几分钟前发布的另一个问题:作为存储库的集成测试,您的建议在我看来也不错。添加,然后删除,然后检查它是否仍在数据库中。然而,我更喜欢围绕用例而不是类进行集成测试。