我刚读完"使用C#进行专业测试驱动开发",并一直试图找到一种方法来实现我的代码100%的覆盖率.这一切都很好,直到我找到一个充满了这样实现的方法的存储库类:
public IEnumerable<MyDataContract> LoadConditional(bool isCondition)
{
const string QUERY = @"SELECT ...fields... FROM MyData WHERE [IsCondition] = @IsCondition";
return DataAccessor.ReadMyContracts(QUERY, isCondition); // something, something...
}
Run Code Online (Sandbox Code Playgroud)
我一直在考虑这个问题,并且无法在互联网上找到直接回答这个问题的答案.
我阅读的内容表明SQL相关业务将存在于另一个程序集中.我不需要这个,但不相信我应该去那里.从代码覆盖的角度来看,这是一个非常肤浅的变化.
我已经读过你可以为你的单元测试连接数据库(我以前做过).但这很好......我不知道,感觉不对.测试很慢并且维护量显着增加.
我的直觉是没有我提到的最后一点,这种方法不能进行单元测试.我该如何看待这个问题?
首先让我说,我相信实现100%的覆盖率根本没有任何意义,也没有任何证据.
话虽这么说,我通常在数据库和业务逻辑之间使用一些层 - 一些简单的映射器(PetaPoco,Dapper,OrmLite),或者很少使用完整的ORM(NHibernate).
在我需要针对数据库进行集成测试的情况下,这些工具允许我针对测试数据库(例如内存中的SQLite数据库)而不是"真正的"数据库服务器运行相同的查询.
关于您对"测试缓慢并且维护量大幅增加"的关注.你应该记住,这些不再是单元测试 - 这些是集成测试,它们不能像单元测试一样快.