Глядя на ваш пример кода, я вижу два возможных подхода к решению проблемы тестирования, которые также можно комбинировать.
Сначала , вы можете разработать тестовые сценарии с использованием MC / DC(измененное условие / покрытие решения).Идея заключается в следующем: для каждого логического ввода b
в ваш код идентифицируйте два тестовых случая, которые имеют следующие свойства: a) Один из тестовых случаев имеет ожидаемый true
результат, а другой - ожидаемый false
результат.б) Оба теста имеют одинаковые входные данные, за исключением b
, который в одном тестовом случае имеет значение true
, а в другом - false
.Другими словами, между этими двумя контрольными случаями только b
изменяет и контролирует выход.
Пример: для того, чтобы вход self.attribute_a_changed?
управлял выходом, другие входы должны иметь следующие значения:
self.attribute_b_changed?
должно быть false
self.attribute_c_changed?
должно быть false
self.bulk_association
должно отличаться от true
self.user.blank?
должно быть false
self.user.active
должно быть true
Затем один тестовый случай со всеми вышеуказанными входными даннымизначения в сочетании с self.attribute_a_changed?
, равным true
, приведут к ожидаемому выводу false
для skip_callback
.Во втором тестовом примере вышеуказанные входные значения будут объединены с self.attribute_a_changed?
, равным false
, и приведут к ожидаемому выводу true
для skip_callback
.Выполнение этих двух тестов даст вам уверенность в том, что вы действительно проверили, что self.attribute_a_changed?
влияет на выход.
MC / DC описывается на этой странице Википедии , которая также имеетссылка на этот учебник от НАСА .Есть также несколько примеров для SO, например, здесь .
Second , вы можете проверить свои тестовые случаи, запустив их для измененных версий (мутаций) вашего кода,Это называется мутационным тестированием и используется для оценки качества набора тестов.Чтобы увидеть, действительно ли один из ваших тестов обнаружил особую ошибку (например, self.attribute_a_changed?
не оказывает желаемого влияния на результаты), просто вставьте эту ошибку и посмотрите, не прошел ли тест.Например, вы можете просто удалить self.attribute_a_changed?
из кода и проверить, заметили ли ваши тесты.Или вы можете инвертировать его в self.attribute_a_changed? == false
и посмотреть, найдут ли ваши тесты эту ошибку.