【发布时间】:2011-06-21 08:28:36
【问题描述】:
这是我为与数据库交互的类编写的集成测试:
[Test]
public void SaveUser()
{
// Arrange
var user = new User();
// Set a bunch of properties of the above User object
// Act
var usersCountPreSave = repository.SearchSubscribersByUsername(user.Username).Count();
repository.Save(user);
var usersCountPostSave = repository.SearchSubscribersByUsername(user.Username).Count();
// Assert
Assert.AreEqual(userCountPreSave + 1, userCountPostSave);
}
在我看来,如果不涉及SearchSubscriberByUsername 函数来确定用户是否成功保存,我就无法测试Save 函数。我意识到集成测试并不意味着应该是一次测试一个代码单元的单元测试。但理想情况下,如果我每次测试都可以在我的存储库类中测试一个函数,但我不知道如何实现这一点,那就太好了。
到目前为止,我编写代码的方式还不错,还是有更好的方法?
【问题讨论】:
-
你在测试哪个类,你什么时候将初始数据输入数据库?
-
(Unit|Integration)测试是有用的,如果你对你编写的软件更有信心并且对改变它更有信心。如果您对文献中的内容不太介意,请不要为了使其更符合大师的要求而破坏有用的测试
-
@Danny:我正在测试我的存储库类,我删除所有表并在每次测试运行开始时重新创建它们(而不是在每次测试之前)。
-
您应该在每个测试运行之前执行此操作(在 TestInitialize 中,而不是 ClassInitialize 中),否则您的测试相互依赖以及它们的运行顺序。 (除非没有个测试写入数据库。)
-
@Danny:不是删除所有表并为每个测试重新创建它们吗?只要测试代码不对数据库的状态做任何假设,我为什么要为每个测试重新创建所有表?
标签: c# nunit automated-tests integration-testing