2015-05-28 4 views
4

Я следующий ActiveRecord метод класса модели:Понимание Mutant Неудачи

def self.find_by_shortlink(shortlink) 
    find_by!(shortlink: shortlink) 
end 

Когда я бегу мутанта против этого метода, я сказал, было 17 мутации и 16 все еще «живы» после того, как тест запуска ,

Вот один из «живых» мутаций:

----------------------- 
evil:Message.find_by_shortlink:/home/peter/projects/kaboom/app/models/message.rb:29:3f9f2 
@@ -1,4 +1,4 @@ 
def self.find_by_shortlink(shortlink) 
- find_by!(shortlink: shortlink) 
+ find_by!(shortlink: self) 
end 

Если я вручную сделать это те же изменения, мои тесты не - как и ожидалось.

Так что мой вопрос: как написать единичный тест, который «убивает» эту мутацию?

ответ

3

Отказ от ответственности, автор-мутант, говорящий.

Mini шпаргалка для таких ситуаций:

  1. Убедитесь, что ваши данные прямо сейчас зеленый.
  2. Изменить код как показывает различия
  3. Попробуйте наблюдать за нежелательным поведением.
    1. Невозможно?
      1. (скорее всего) Возьмите мутацию как лучший код.
      2. (маловероятно) Сообщить об ошибке в мутант
    2. Найдены изменение поведения: закодировать его как испытание, или изменить тест, чтобы покрыть это поведение.
  4. Rerun mutant, чтобы проверить смерть мутации.
  5. Убедитесь, что мутант фактически перечисляет те тесты, которые вы добавили в качестве используемых для этой мутации. Если не реструктурировать тесты, чтобы охватить тему мутации в выбранных тестах.

Теперь к вашему делу: Если вы примените мутацию к вашему коду. Аргумент игнорируется и по существу жестко закодирован (значение для ключа :shortlink, используемого в вашем поиске, не изменяется в зависимости от аргумента shortlink). Итак, единственное, что вам нужно сделать в своем тесте, - это добавить случай, когда аргумент shortlink имеет значение для ожидания, которое вы ставите в тесте.

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

+0

Спасибо за подробный ответ! Есть кое-что, что я до сих пор не понимаю (некоторые вещи, на самом деле, но я буду держать это в сжатом виде) о моем примере. Изменение параметра 'self' вызывает исключение' ActiveRecord:; StatementInvalid'. Это из-за проблем принуждения, о которых вы упомянули, или это то, что Mutant ожидает, что мои тесты будут рассмотрены? – pdoherty926

+0

Что это значит, так это то, что ваши тесты не проверяют, что такое значение вообще. Тот факт, что значение может быть заменено на «я» (удобный режим ожидания для случайного объекта), означает, что для этой части метода нет спецификации. – dkubb

+0

@dkubb Будет ли это означать насмешку 'find_by! ', Добавляя в мои тесты утверждения о значении параметра или что-то еще?Мог бы указать мне пример такой спецификации? – pdoherty926

Смежные вопросы