2012-03-15 4 views
2

У меня есть тестовый файл, в котором я заглушаю зависимости (репозитории в основном) моего тестируемого класса. Пример хранилища погасил (укорачивается примерно от 200 линий):Как избежать дублирования кода для аналогичных заглушек?

internal class doerRepository : IDoerRepository 
{ 
    public IQueryable<Doer> ActiveDoers 
    { 
     get 
     { 
      Account account = new Account(); 
     //Property setting for account 

     Zone zone = new Zone(); 
     //Property setting for zone 

     Doer doer = new Doer(); 
     doer.Zone = doerZone; 
     doer.Account = doerAccount; 

     var list = new List<Doer>(); 
     list.Add(doer); 
     return list.AsQueryable(); 
    } 
} 

}

и метод испытания выглядит следующим образом:

[Test] 
public void IsValidDoer_DoerIsValid() 
{ 
    var doerValidation = new DoerValidation(new doerRepository()); 
    //Assert things 
} 

Проблема заключается в том, что эта среда объекта (это окурки около половины базы данных) является моей базой. У меня есть около 25 тестов для этого тестового файла. Для каждого теста я должен слегка изменить заглушку (попробуйте с недопустимой зоной, недопустимой учетной записью и т. Д.). Я заканчиваю копирование, вставляя 200 строк, чтобы изменить одну мелочь (и мне нужно переименовать класс за это).

Можно ли повторно использовать код заглушки и внести соответствующие изменения? Я попытался это, но значение, которое я изменить не обновляется

internal class doerRepository2 : IDoerRepository 
{ 
    public IQueryable<Doer> ActiveDoers 
    { 
     get 
     { List<Doer> list = new doerRepository().ActiveDoers.ToList(); 
      list.First().Account = new Account(); 
      return list.AsQueryable(); 
     } 
    } 
} 

ответ

3

Вы можете избежать написания заглушек вручную, используя некоторые рамки изоляции. Это позволяет динамически создавать заглушки. Я лично предпочитаю Moq. С этим ваш тест можно написать таким образом.

[Test] 
public void IsValidDoer_DoerIsValid() 
{ 
    var mockRepository = new Mock<IDoerRepository>(); 
    var activeDoers = CreateSpecificDoerList(); 
    mockRepository.Setup(r => r.ActiveDoers).Returns(activeDoers); 

    var doerValidation = new DoerValidation(mockRepository.Object); 

    // Assert things 
} 

Здесь вы создаете динамический окурок и говорить, что это ActiveDoers должны вернуть конкретный список исполнителей.

+0

Awsome, это помогает! – Mathieu

1

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

Таким образом, я обычно избегаю всего одного заглушки, так как я могу повторно использовать его, установив различные комбинации данных, которые будут возвращены.

+0

Да, это также может добавить гибкость! – Mathieu

Смежные вопросы