Я очень плохо знаком с юнит-тестированием и издевательством! Я пытаюсь написать некоторые модульные тесты, которые охватывают некоторый код, который взаимодействует с хранилищем данных. Доступ к данным инкапсулирован IRepository:
interface IRepository<T> {
....
IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate);
....
}
Код, который я пытаюсь протестировать с использованием конкретной реализации IRepository в IoC, выглядит следующим образом:
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();
}
}
Так что я проверяю логику самой RegistrationLogic.AddNewCompany (), а не логику и конкретный репозиторий, я копирую IRepository и передаю его в RegistrationLogic. Макетированный репозиторий выглядит так:
Mock<Repository> repoMock = new Mock<Repository>();
repoMock.Setup(moq => moq.FindBy(c => c.Name == "Company Inc")....
, который возвращает IEnumberable в памяти, содержащий объект Company с именем, установленным в «Company Inc». Модульный тест, который вызывает RegistrationLogic.AddNewCompany, устанавливает компанию с дублирующими данными и пытается передать это, и я утверждаю, что ArgumentException генерируется с сообщением «Компания уже существует». Этот тест не пройден.
Отладка с помощью модульного теста и AddNewCompany () при его запуске может показаться, что существующая компания всегда имеет значение null. В отчаянии я обнаружил, что если я обновляю RegistrationLogic.AddNewCompany (), то вызов FindBy будет выглядеть так:
Company existingCompany = this.repo.FindBy(c => c.Name == "Company Inc").FirstOrDefault();
тест пройден, что говорит о том, что Moq отвечает только на код, который точно такой же, как я настроил в своем тестовом устройстве. Очевидно, что это не особенно полезно при тестировании, так как любая дублирующая компания отклоняется с помощью RegistrationLogic.AddNewCompany.
Я попытался настроить moq.FindBy (...) для использования "Is.ItAny", но это также не приводит к прохождению теста.
Из всего, что я читаю, может показаться, что тестирование Expressions, которое я пытаюсь сделать, на самом деле не подходит для Moq здесь. Является ли это возможным? Пожалуйста, помогите!