Как избежать дублирования кода для похожих заглушек? - PullRequest
2 голосов
/ 15 марта 2012

У меня есть тестовый файл, в котором я заглушаю зависимости (в основном репозитории) моего тестируемого класса.Пример заглушки хранилища (сокращено примерно на 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();
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Вы можете избежать написания заглушек вручную, используя некоторую изолированную среду.Это позволяет динамически создавать заглушки.Я лично предпочитаю 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 должен возвращать ваш конкретный список исполнителей.

1 голос
/ 15 марта 2012

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

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

...