Огурец "кладет" в "После того, как крючок не выводит ничего"

В Cucumber, в моем env.rb файле, у меня есть до и после настройки крючка (ну, некоторые из них, некоторые связаны с определенными тегами), но обнаружили, что после перехвата ничего не выводит, когда я помещаю a puts в них.

Например, это работает:

Before do
  puts "before the scenario"
end

но это не так:

After do
  puts "after the scenario"
end

Кажется, что после перехвата запустите (как есть определенная строка, с которой я столкнулся с проблемой после этого, и при попытке отладить это, я нашел эту проблему), но они просто не выводят что-нибудь.

Все мои поиски оказались бесплодными, не могут найти никого другого с подобными проблемами. Может ли кто-нибудь сказать, что я делаю что-то неправильно?

Ответы

Ответ 1

Огурчик переопределяет сообщение puts в классе RbWorld, чтобы все, написанное с помощью puts, правильно транслировалось во всех форматировщиках. В случае форматера pretty они переходят в коллекцию delayed_messages, пока не назовет print_messages, который, по-видимому, будет выполняться после того, как будет напечатано каждое имя шага, предположительно, чтобы сообщения оказались вложенными под шаг в котором они были сгенерированы.

По какой-то причине окончательный вызов print_messages в симпатичном форматировании, я не уверен, что это упущение или преднамеренное, поскольку оно выглядело бы менее "красивым", чтобы иметь ложные сообщения на выходе.

Интересно, что если вы добавите второй сценарий, вы увидите, что "после сценария" будет напечатан как первое сообщение при запуске второго сценария, что коллекция delayed_messages в действии.

Итак, вы ничего не делаете неправильно, просто как Cucumber увлекает метод puts. Если вы не слишком обеспокоены тем, что эти сообщения хорошо отформатированы, вы можете просто заменить puts на STDOUT.puts, чтобы обойти форматирование огурца.

Ответ 2

 Before do
     p "Go!"
     puts "Go!"
 end

 After do
     p "Stop!"
     puts "Stop!"
     $stdout.puts "Stop!"
 end

вывод этого фрагмента может помочь понять, почему "puts" не работает в After hook.