如何对按日期范围返回文章的查询进行单元测试?

时间:2009-10-27 19:53:38

标签: c# unit-testing nunit

假设我有一个文章表,我想为返回所有即将过期的文章的方法编写一个测试。

我将如何为此编写单元测试?如果我模拟该方法返回的文章集合,那么单元测试怎么样?

我的意思是我想确保它返回正确的文章数据范围?

有人可以澄清一下吗?

5 个答案:

答案 0 :(得分:1)

如果您正在测试数据访问层本身,您可能确实需要访问一些数据。许多人认为,对数据库等外部依赖性的测试是“集成”测试而不是“单元”测试 - 这并不意味着它们并不重要。

一种选择是使用轻量级或内存数据库,例如SQLite。在设置测试时,使用一组已知数据为数据库设定种子。然后,您可以安全地以受控方式测试结果。

您想要控制的另一个因素:当您创建依赖于当前日期的内容时(如本例所示),您需要一种方法来注入虚假的“当前日期”以使测试更容易 - 不要只在数据库中使用“SYSDATE”或等效文件,否则您的测试将变得更加困难(您的测试数据必须根据日期进行更改)。

答案 1 :(得分:1)

我通常有一些由单元测试框架驱动的集成测试,它可以处理一组确定的数据(包括为每次测试运行设置数据的脚本as described here)。这样你就可以准确地知道在给定的日期范围内应该返回多少(和哪些)文章,然后你也可以为它创作一个测试。

答案 2 :(得分:1)

如果你嘲笑它,它是一个单元测试,因为你正在测试尽可能少的功能。

如果你不嘲笑它,并且反对实时数据库,正如Dror所说,这是一个集成测试。

答案 3 :(得分:0)

没有办法“单元测试”数据访问层,而是可以编写一个“集成测试”,它将设置一个简单的数据库查询,并使用断言来检查结果。

测试后还需要运行一个clean函数,以确保数据库恢复到初始状态。

  • 如果你使用MSTest,你可以使用部署项来设置数据库,否则你将不得不编写简单的帮助方法。

如果您想检查业务逻辑 - 即如何处理结果,则使用模拟从查询中创建虚假回溯。

答案 4 :(得分:0)

这种类型的测试确实是如前所述的集成测试。你可以使用MSTest或NUnit作为测试运行器,但是一个好的经验法则是将这些测试分成各自的程序集或类别,这样每次运行快速单元测试时都不会运行它们。要完成此集成测试应该不是很困难,您需要执行以下操作:

  1. 创建数据库/清除现有数据库
  2. 使用来自SQL脚本或ndbunit等框架的数据对数据库进行种子设定,此步骤可以在“测试设置”或类似的设置例程中完成。
  3. 运行集成测试并断言上一步中播种的已知数据与代码返回的结果相符
  4. 清理数据库并截断/删除数据库中的记录,这样它们就不会对其他测试产生负面影响。
  5. 但同样谨慎的是,如果您没有很多良好的实践来快速轻松地设置系统,那么这些类型的测试会非常令人沮丧,因为集成测试在很大程度上依赖于整个系统处于某个“状态”以成功通过。使这些类型的测试可重复且易于运行将使未来的集成甚至整个系统范围的测试更容易实现。