Here’s an integration test I wrote for a class that interacts with a database:
[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);
}
It seems to me that I can’t test the Save function without involving the SearchSubscriberByUsername function to find out if the user was successfully saved. I realize that integration tests aren’t meant to be unit tests which are supposed to test one unit of code at a time. But ideally, it would be nice if I could test one function in my repository class per test but I don’t know how I can accomplish that.
Is it fine how I’ve written the code so far or is there a better way?
You have a problem with your test. When you’re testing that data is saved into the database, you should be testing that it’s in the database, not that the repository says that it’s in the database.
If you’re testing the functionality of repository, then you can’t verify that functionality by asking if it has done it correctly. It’s the equivalent of saying to someone ‘Did you do this correctly?’ They are going to say yes.
Imagine that repository never commits. Your test will pass fine, but the data won’t be in the database.
So, what I would do is to to open a connection (pure SQL) to the database and check that the data has been saved correctly. You only need to a select count(*) before and after to ensure that the user has been saved. If you do this, you can avoid using the SearchSubscribersByUsername as well.
If you’re testing the functionality of repository, you can’t trust repository, by definition.