Я очень новичок в модульном тестировании и насмешливости! Я пытаюсь написать некоторые модульные тесты, которые охватывают некоторый код, который взаимодействует с хранилищем данных. Доступ к данным инкапсулируется IRepository:
interface IRepository<T> {
....
IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate);
....
}
Код, который я пытаюсь проверить, используя конкретную реализацию IoC'd IRepository, выглядит следующим образом:
public class SignupLogic {
private Repository<Company> repo = new Repository<Company>();
public void AddNewCompany(Company toAdd) {
Company existingCompany = this.repo.FindBy(c => c.Name == toAdd.Name).FirstOrDefault();
if(existingCompany != null) {
throw new ArgumentException("Company already exists");
}
repo.Add(Company);
repo.Save();
}
}
Итак, я тестирую логику самого RegisterLogic.AddNewCompany(), а не логику и конкретный репозиторий, я издеваюсь над IRepository и передаю его в RegistrationLogic. Исправленный репозиторий выглядит следующим образом:
Mock<Repository> repoMock = new Mock<Repository>();
repoMock.Setup(moq => moq.FindBy(c => c.Name == "Company Inc")....
который возвращает IE-номер в памяти, содержащий объект Company с именем, установленным в "Company Inc". unit test, который вызывает RegistrationLogic.AddNewCompany, создает компанию с повторяющимися данными и пытается передать ее, и я утверждаю, что ArgumentException вызывается сообщением "Компания уже существует". Этот тест не проходит.
Отладка через unit test и AddNewCompany() при запуске будет казаться, что existingCompany всегда имеет значение null. В отчаянии я обнаружил, что если я обновляю RegistrationLogic.AddNewCompany(), чтобы вызов FindBy выглядел следующим образом:
Company existingCompany = this.repo.FindBy(c => c.Name == "Company Inc").FirstOrDefault();
проходит тест, который подсказывает мне, что Moq реагирует только на код, который точно такой же, как я установил в своем тестовом кресле. Очевидно, что это не особенно полезно при тестировании того, что любая дублирующаяся компания отклоняется RegistrationLogic.AddNewCompany.
Я попытался настроить moq.FindBy(...) для использования "Is.ItAny", но это не приводит к тому, что тест пройдет.
Из всего, что я читаю, кажется, что тестирование выражений, как я пытаюсь, на самом деле не работает с Moq. Является ли это возможным? Пожалуйста, помогите!