在TDD中创建测试数据的最佳位置在哪里?

时间:2010-11-16 15:57:44

标签: c# unit-testing nunit

我使用NUnit集成测试。 我正在尝试测试以确保用户无法使用现有电子邮件创建帐户。 (test@example.com)

我需要在数据库中拥有测试数据(使用test@example.com电子邮件帐户)。

我可以在测试函数或sql脚本中创建此帐户(并在集成测试之前运行它)。

创建此测试数据的最佳位置在哪里?

3 个答案:

答案 0 :(得分:5)

这两种选择都不对,但有很多方法可以扩展和巩固你的策略:

这些解决方案都不是互斥的。我会推荐最后一项(特别是可插拔提供程序),然后在对象模拟或虚拟但质量数据库测试数据之间进行选择。

答案 1 :(得分:2)

最好的办法是研究依赖注入和模拟框架。这样,您就可以使用模拟数据提供程序交换数据提供程序,并使用符合特定测试需求的数据。

如果您正在使用NHibernate或类似程序,则可以在每次测试(夹具)之前始终重新创建数据库模式。

答案 2 :(得分:1)

在您描述的情况下,我更愿意在测试功能中创建帐户。

单元测试应尽可能自包含。此外,如果您可以在一个地方看到测试所需的所有数据,那么能够理解您正在测试的内容是有帮助的。

这是一个完整的例子,应该说明:

[Test]
public void Test_CannotCreateDuplicateEmail()
{
   // Arrange
   CreateAccount("test@example.com");   // OK

   // Act
   try
   {
      CreateAccount("test@example.com");

      // If control arrives here, then the test has failed.
      Assert.Fail();
   }

   // Assert
   catch(AccountException ex)
   {
        // Assert that the correct exception has been thrown.
        Assert.AreEqual("Failed", ex.Message);
   }
}