集成测试:我做得对吗?

xTR*_*ANx 7 c# integration-testing nunit automated-tests

这是我为一个与数据库交互的类编写的集成测试:

[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);
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我无法在Save不涉及函数的情况下测试该函数,SearchSubscriberByUsername以确定用户是否已成功保存.我意识到集成测试并不是单元测试,它应该一次测试一个代码单元.但理想情况下,如果我可以在每个测试中测试我的存储库类中的一个函数,那将会很好,但我不知道如何实现这一点.

我到目前为止编写代码还是有更好的方法可以吗?

Mat*_*ell 8

您的测试有问题.当您测试将数据保存到数据库中时,您应该测试它是否在数据库中,而不是存储库说它在数据库中.

如果您正在测试存储库的功能,那么您无法通过询问它是否已正确完成来验证该功能.这相当于对某人说'你做得对吗?' 他们会说是的.

想象一下,存储库永远不会提交.您的测试将正常通过,但数据将不在数据库中.

那么,我要做的是打开一个连接(纯SQL)到数据库,并检查数据是否已正确保存.您只需要在之前和之后选择计数(*)以确保用户已被保存.如果这样做,您也可以避免使用SearchSubscribersByUsername.

如果您正在测试存储库的功能,则根据定义,您无法信任存储库.