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