I can make my code more reliable using interfaces.
If I have a ManagerClass
public class PersonManager
{
public PersonManager(IPersonRepository repository)
{
this.Repository = repository;
}
private IPersonRepository Repository{get;set;}
public Person ChangeUsername(string username)
{
Person person = this.Repository.GetByUsername(username);
person.Username = username;
this.Repository.Save(person);
return person;
}
}
The release code will use a repository object that will call the database, but for my unit test I want to isolate the database dependency so that I can create a mock repository that implements my interface:
public class MockPersonRepository : IPersonRepository
{
public Person GetByUsername(string username)
{
return new Person();
}
public void Save()
{}
}
And when I write my unit test, I can pass the layout:
[Test]
public void ChangeUserName_NewUsername_ExpectUpdateUsername()
{
var manager = new PersonManager(new MockPersonManager());
Person person = manager.ChangeUsername("bob");
Assert(AreEqual("bob", person.Username);
}
I now have a manager to verify that my ChangeUsername method has updated the username without talking to the database
source
share