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

时间:2013-03-11 14:20:03

标签: 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 = new SqlConnection(connstring))
        {
            conn.Open();
            SqlCommand command = new SqlCommand("DELETE FROM PRODUCTS WHERE ID = @ID")
            command.Paramaters.Add("@ID", id)
            command.ExecuteNonQuery();
        }
    }
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我的建议 - 为存储库编写集成测试(因为您使用的是数据访问框架),除非您在存储库中执行的操作不仅仅是CRUD。

添加/查找是所有单独的存储库方法,它们需要自行测试。

我建议,使用Setup来设置您知道可以采取行动的种子数据。在这种情况下,将记录插入Products表。

然后行动:致电Repository.Deleteproduct(<product id created in setup>)

断言:删除设置中创建的产品(再次查询数据库以进行检查)。

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

答案 2 :(得分:0)

我从未为数据库调用添加单元测试。这绝对是一个集成测试。没有什么可以观察到的。

我知道Java有一些适合JUnit的工具。 IT要求您编写前后模仿的XML文件,然后将表的内容与XML文件进行比较。我相信.Net会有类似的东西。但是我不确定它是否值得。我发现这些测试非常脆弱,而且价值很小。

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