Методы Moq'ing, где Expression > передаются как параметры

Я новичок в модульном тестировании и имитировании! Я пытаюсь написать несколько модульных тестов, охватывающих некоторый код, который взаимодействует с хранилищем данных. Доступ к данным инкапсулируется 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 () во время его выполнения, может показаться, что existingCompany всегда имеет значение NULL. В отчаянии я Мы обнаружили, что если я обновляю RegistrationLogic.AddNewCompany () так, чтобы вызов FindBy выглядел так:

Company existingCompany = this.repo.FindBy(c => c.Name == "Company Inc").FirstOrDefault();

тест проходит, что говорит мне, что Moq отвечает только на код, который точно тот же как я установил в своем тестовом приспособлении. Очевидно, что это не особенно полезно при тестировании того, что любая дублирующая компания отклоняется RegistrationLogic.AddNewCompany.

Я пытался настроить moq.FindBy (...) для использования Is.ItAny, но это не привело к тест на прохождение.

Из всего, что я читаю, может показаться, что тестирование выражений, которое я пытаюсь выполнить, на самом деле невозможно выполнить с помощью Moq. Является ли это возможным? Пожалуйста, помогите!

60
задан Ruben Bartelink 4 March 2011 в 22:59
поделиться