我刚刚读完“使用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...
}
我已经考虑了一段时间,还没有在互联网上找到直接回答这个问题的答案。
我读过一些东西,暗示与SQL相关的业务将存在于另一个程序集中。我不需要这个,也不相信我应该去那里。从代码覆盖率的角度来看,这是一个非常肤浅的变化。
我读到您可以为单元测试连接数据库(之前已经完成)。但这很好...我不知道,感觉不对。测试很慢,并且维护量大大增加。
我的直觉是,没有我提到的最后一点,就无法对该方法进行单元测试。我应该如何看待这个问题?
最佳答案
首先让我说,我相信达到100%的覆盖率毫无意义,也不能证明任何事情。
话虽如此,我通常在数据库和业务逻辑之间使用一些层-一些简单的映射器(PetaPoco,Dapper,OrmLite),或者很少使用完整的ORM(NHibernate)。
在需要针对数据库进行集成测试的情况下,这些工具可让我针对测试数据库(例如内存中的SQLite数据库)而非“实际”数据库服务器运行相同的查询。
关于您的担忧,即“测试速度缓慢且维护量显着增加”。您应该记住,这些不再是单元测试-它们是集成测试,并且不能像单元测试那样快。
关于c# - TDD-包装SQL的方法的100%覆盖率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15340569/