Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在TDD中创建测试数据的最佳位置在哪里?_C#_Unit Testing_Nunit - Fatal编程技术网

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

C# 在TDD中创建测试数据的最佳位置在哪里?,c#,unit-testing,nunit,C#,Unit Testing,Nunit,我使用NUnit集成测试。 我正在尝试进行测试,以确保用户无法使用现有电子邮件创建帐户。(test@example.com) 我需要有在数据库中的测试数据(与帐户)test@example.com电子邮件) 我可以在测试函数或sql脚本中创建此帐户(并在集成测试之前运行它) 创建此测试数据的最佳位置在哪里?这两个选项都没有错,但有许多方法可以扩展和巩固您的策略: 这与TDD密切相关 使用以下工具生成db测试数据: 创建(IoC/DI),您可以在测试和生产之间交换 这些解决方案都不是相互排斥的

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

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

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


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

这两个选项都没有错,但有许多方法可以扩展和巩固您的策略:

  • 这与TDD密切相关
  • 使用以下工具生成db测试数据:
  • 创建(IoC/DI),您可以在测试和生产之间交换

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

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


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

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

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

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

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

+1用于RedGate的Sql数据生成器;我以前不知道这件事。谢谢