Я могу сделать свой код более тестируемым с помощью интерфейсов.
Если у меня есть 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;
}
}
В коде выпуска будет использоваться объект репозитория, который будет вызывать базу данных, но для моего модульного теста я хочу изолировать зависимость от базы данных, чтобы я мог создать фиктивный репозиторий, который реализует мой интерфейс:
public class MockPersonRepository : IPersonRepository
{
public Person GetByUsername(string username)
{
return new Person();
}
public void Save()
{}
}
И когда я пишу свой модульный тест, я могу пройти в макете:
[Test]
public void ChangeUserName_NewUsername_ExpectUpdateUsername()
{
//Arrange
var manager = new PersonManager(new MockPersonManager());
//Act
Person person = manager.ChangeUsername("bob");
//Assert
Assert(AreEqual("bob", person.Username);
}
Теперь у меня есть менеджер, чтобы проверить, что мой метод ChangeUsername обновил имя пользователя, пока не общался с базой данных