модульный тест, чтобы убедиться, что хранилище правильно загружает объект из базы данных - PullRequest
1 голос
/ 30 сентября 2011

У меня есть простой стандартный репозиторий, который загружает составную сущность из базы данных. Он внедряет все зависимости, которые ему нужны для чтения полного дерева сущностей из базы данных через IDbConnection (что дает доступ к хранилищу для IDbCommand, IDbTransaction, IDataReader), которые я мог бы высмеять.

public class SomeCompositionRootEntityRepository : 
    IRepository<SomeCompositionRoot>
{
    public RecipeRepository(IDbConnection connection) { ... }
    public void Add(SomeCompositionRootEntity item) { ... }
    public bool Remove(SomeCompositionRootEntity item) { ... }
    public void Update(SomeCompositionRootEntity item) { ... }
    public SomeCompositionRootEntity GetById(object id) { ... }
    public bool Contains(object id) { ... }
}

Вопрос в том, как мне написать хороший тест для этого? Если я хочу проверить, что хранилище прочитало все дерево объектов и правильно его прочитало, мне нужно было бы написать огромный макет, который записывает и проверяет чтение каждого свойства каждого объекта в дереве. Это действительно путь?

Обновление: Я думаю, что мне нужно реорганизовать мой репозиторий, чтобы разбить его функциональность и модульное тестирование на более мелкие модули. Как это можно сделать?

Я уверен, что не хочу писать модульный тест, который включает чтение и запись из реальной базы данных и в нее.

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Вопрос: Какую функциональность вы хотите проверить?

  1. Хотите ли вы проверить, что ваш репозиторий действительно что-то загружает?В этом случае я бы написал несколько (!) Тестов, проходящих через базу данных.
  2. Или вы хотите проверить функциональность методов репозитория?В этом случае ваш фиктивный подход был бы уместен.
  3. Или вы хотите убедиться, что (тривиальные) методы вашего хранилища не нарушены?В этом случае может быть достаточно макетов и одного теста на метод.

Просто спросите себя, что тесты должны обеспечить, и спланируйте их по этой цели!

0 голосов
/ 30 сентября 2011

Мне кажется, я понимаю ваш вопрос, так что поправьте меня, если я ошибаюсь ...

Здесь вы пересекаете линию от единицы к интеграции.Этот тест имеет смысл (я сам написал это), но вы на самом деле не тестируете свой репозиторий, скорее вы проверяете, что ваша сущность (SomeCompositionRoot) отображается правильно.Он не вставляется / не обновляется, но включает чтение в базу данных.

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

:: EDIT :: как это для linq например ...

    [TestMethod]
    public void ShouldMapBlahBlahCorrectly()
    {
        CheckBasicMapping<BlahBlah>();
    }

    private T CheckBasicMapping<T>() where T : class
    {
        var target = _testContext.GetTable<T>().FirstOrDefault();
        target.ShouldNotBeNull();
        return target;
    }
...