在我的简单项目中,我已经准备好对DAL进行单元测试了。
我基本上有一个名为FooDataAccess的类,它有几个非常简单的函数,让我们说3个像这样:
int InsertFoo(string fooName)
void UpdateFoo(int fooID, string fooName)
void InsertFoosDepedency(int fooID, string someValue)
我做的是这个 - 在我的单元测试项目中放入4个SQL脚本,最后一个作为嵌入式资源。
1)创建(单元测试)数据库脚本,2)创建对象脚本,3)插入查找表值和4)删除所有但查找表值
这个想法是,任何第一次使用该项目的人都应该手动运行脚本1-3作为一次性设置。然后在启动每个单元测试时执行脚本#4 ...(在小型应用程序中,您甚至可以在测试级别运行所有这些)
好的,到目前为止一直很好......
所以我将单元测试数据库设置为空白。测试第一个函数InsertFoo()显然非常简单。我调用该函数,然后只是Assert(ExecuteSQL(“从foo中选择计数(*)”)> 1),断言(ExecuteSQL(“从t_foo中选择fooName”)=预期))等等。
我有点困难的是那些需要依赖的东西,比如我的例子中的第三个函数,甚至是更新。
暂时删除测试范围内的所有外键约束是否有意义?否则,为了单元测试InsertFoosDepedency(int fooID,string someValue)函数,我必须先执行一些任意的sql(手动将记录插入FOO表并返回FooID)...
或者,我应该做后者吗?
非常感谢任何和所有反馈。
更新:它使用内联SQL干净利落地创建依赖项。我想我只是在寻找评论&批评这种单元测试DAL的方法。再次感谢
答案 0 :(得分:2)
这听起来和我的做法非常相似。我在start of each test销毁数据库中的所有数据,然后在测试设置阶段建立测试所需的内容。所以对UpdateFoo
我会有
void update_existingKey_updatesValue() {
String expected = "jeff";
clearDatabase();
// Note I would use dbUnit.
executeSQL("insert into foo values (1, 'fred')");
DAL subject = new DAL(...);
subject.update(1, expected);
//Note I would use dbUnit.
String actual = executeSQL("select name from foo where id = 1");
assert(expected, actual);
}
在Java中,我使用名为dbUnit的工具,您的方法名称建议使用C#,所以我会指向dbUnit.Net但是我从未使用过这个。这提供了一种更好的(IMO无论如何)填充数据库和验证数据库内容的方法。
答案 1 :(得分:1)
为了测试,我会说从不使用您的架构。如果你没有把它放回去,或者你的代码将它丢回,你就会很快发现自己陷入混乱。
您可以使用Mock Objects吗?
如果不是,我认为您所能做的就是为每个测试设置数据库预先请求。
您可以为每个测试考虑一个单独的类,并使用Setup和Teardown方法使数据库处于正确的测试条件。
或者你只需要在Test方法中进行特定于测试的设置(然后你就可以使用Teardown清空数据库了。)