Должен ли я тестировать публичную функцию класса, которая изменяет только внутреннее состояние объекта?

Я решил добавить модульные тесты к существующему проекту (довольно большой). Я использую "инструментарий Google для Mac" для различных типов STAssert... и среды OCMock.

Но я думаю, что тестирую неправильно. Например, у меня есть публичная функция saveData​​strong > , которая ничего не возвращает и только изменяет внутреннее состояние объекта. Должен ли я его проверить? Из-за принципа инкапсуляции - мне не нужно много волноваться о реализации объекта, и я не должен зависеть от частных переменных (потому что они могут быть изменены/удалены в будущем)

@implementation Foo
-(void) saveData {
 internalData_ = 88;
}

В реальном проекте эта функция saveData имеет длину 100 строк и меняет много частных переменных класса.

Итак, я должен проверить это или нет? У меня есть немного предыдущего опыта в модульном тестировании и я не могу принять решение самостоятельно.

Ответ 1

Изменяется ли внутреннее состояние, влияющее на последующие вызовы этого объекта? Если это так, вы должны включить его в unit test как

  • Проверить a()
  • Сделайте saveData()
  • Повторите тест a()

Даже если нет, это может быть хорошей идеей для unit test. Не для определения, будет ли другой код разбиваться с использованием этого метода, но для автоматического тестирования правильной реализации метода. Несмотря на то, что метод ничего не возвращает, он, вероятно, все еще имеет какой-то контракт ( "Если я его называю, это должно произойти" ), и вы должны проверить, произошло ли что-то (например, строка, добавленная в журнал файл или что-то).

Теперь, как проверить, что если метод ничего не возвращает, это еще один вопрос. Как ни странно, эта деталь реализации unit test.