代码之家  ›  专栏  ›  技术社区  ›  Anatoliy

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

  •  4
  • Anatoliy  · 技术社区  · 14 年前

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

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

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

    在哪里更好地创建这个测试数据?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Paul Sasik    14 年前

    这两种选择都是错误的,但有许多方法可以扩展和巩固您的战略:

    这些解决方案都不是相互排斥的。我将特别推荐最后一个项目(可插拔的提供者),然后在对象模拟或人造但高质量的数据库测试数据之间进行选择。

        2
  •  2
  •   RoelF    14 年前

    您最好的选择是研究依赖注入和模拟框架。通过这种方式,您可以将数据提供程序与模拟数据提供程序交换,并使用适合特定测试需要的数据。

    如果您使用的是nhibernate或类似工具,那么您可以在每次测试(fixture)之前重新创建DB模式。

        3
  •  1
  •   Matt Brunell    14 年前

    在您描述的情况下,我希望在测试函数中创建帐户。

    单元测试应尽可能独立。此外,如果您可以在一个地方看到测试所需的所有数据,那么了解您正在测试的内容也会有所帮助。

    下面是一个完全虚构的例子,可以说明:

    [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);
       }
    }