Должен ли я тестировать публичную функцию класса, которая изменяет только внутреннее состояние объекта?
Я решил добавить модульные тесты к существующему проекту (довольно большой).
Я использую "инструментарий Google для Mac" для различных типов STAssert... и среды OCMock.
Но я думаю, что тестирую неправильно. Например, у меня есть публичная функция saveDatastrong > , которая ничего не возвращает и только изменяет внутреннее состояние объекта. Должен ли я его проверить? Из-за принципа инкапсуляции - мне не нужно много волноваться о реализации объекта, и я не должен зависеть от частных переменных (потому что они могут быть изменены/удалены в будущем)
@implementation Foo
-(void) saveData {
internalData_ = 88;
}
В реальном проекте эта функция saveData имеет длину 100 строк и меняет много частных переменных класса.
Итак, я должен проверить это или нет? У меня есть немного предыдущего опыта в модульном тестировании и я не могу принять решение самостоятельно.
Ответы
Ответ 1
Изменяется ли внутреннее состояние, влияющее на последующие вызовы этого объекта? Если это так, вы должны включить его в unit test как
- Проверить a()
- Сделайте saveData()
- Повторите тест a()
Даже если нет, это может быть хорошей идеей для unit test. Не для определения, будет ли другой код разбиваться с использованием этого метода, но для автоматического тестирования правильной реализации метода. Несмотря на то, что метод ничего не возвращает, он, вероятно, все еще имеет какой-то контракт ( "Если я его называю, это должно произойти" ), и вы должны проверить, произошло ли что-то (например, строка, добавленная в журнал файл или что-то).
Теперь, как проверить, что если метод ничего не возвращает, это еще один вопрос. Как ни странно, эта деталь реализации unit test.