假设我有一个类似下面的课程。
我不确定如何编写单元/集成测试。是否需要重构?
只是添加一个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();
}
}
}
答案 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会有类似的东西。但是我不确定它是否值得。我发现这些测试非常脆弱,而且价值很小。
我建议采取实用的方法,不要为数据库对象编写测试。而是测试那些与数据库对象交互的对象。