Правильно издеваться над родовым методом - PullRequest
2 голосов
/ 23 октября 2011

Новое в Moq и Mocking в целом. Тестирование класса, который имеет универсальный RepositoryFactory и использует несколько его репозиториев. Должен ли я инициализировать, как это или есть какой-то лучший способ?

Mock<IRepositoryFactory> factory;
        Mock<IRepository<User>> userRepository;
        Mock<IRepository<Role>> roleRepository;
        Mock<IRepository<Meeting>> meetingRepository;

        [TestInitialize()]
        public void MyTestInitialize()
        {
            meetingRepository = new Mock<IRepository<Meeting>>();
            //some meeting setup

            userRepository = new Mock<IRepository<User>>();
            //some user setup

            roleRepository = new Mock<IRepository<Role>>();
            //some role setup

            factory = new Mock<IRepositoryFactory>();
            factory.Setup(f => f.CreateRepository<Meeting>()).Returns(meetingRepository.Object);
            factory.Setup(f => f.CreateRepository<User>()).Returns(userRepository.Object);
            factory.Setup(f => f.CreateRepository<Role>()).Returns(roleRepository.Object);

Обратите внимание, что я мог бы иметь намного больше.

здесь я делаю все это в своем методе инициализации, но думаю, что я должен сделать это индивидуально или что-то еще.

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Я не знаю, как настроить f => f.CreateRepository<T>(), учитывая, что настройки вашего репозитория могут отличаться для каждого T. Кроме того, вы можете использовать функциональные спецификации (см. сообщение в блоге ), что делает вещи немного чище.

Для вашего примера это будет выглядеть так:

var factory = Mock.Of<IRepositoryFactory>(
    x => 
    x.CreateRepository<Meeting>() == Mock.Of<IRepository<Meeting>>() &&
    x.CreateRepository<Role>() == Mock.Of<IRepository<Role>>() &&
    x.CreateRepository<User>() == Mock.Of<IRepository<User>>()
    );
1 голос
/ 23 октября 2011

Технически, я не вижу проблемы с вашим кодом.

Тем не менее, это немного беспокоит, что вы даже не начали работать над классом, который хотите протестировать, и у вас уже есть 4 насмешки, и «может быть гораздо больше». Это звучит как ужасно много настроек.

Кроме того, если мое понимание [TestInitialize] правильное, это означает, что для каждого теста в этом классе каждый репозиторий будет настроен одинаково. Это, вероятно, помешает определить тесты с различными условиями.

Может быть, вам следует отказаться от [TestInitialize] и настроить репозитории, которые вам нужны в каждом методе тестирования, в зависимости от того, что вы хотите утверждать, и постепенно извлекать настройки для каждого репозитория в общие методы, следуя стилю BDD: " Given_User_Of_Type_VIP () "возвращает репозиторий с пользователем настройки типа VIP.

...