Во-первых, ваш код ничего не тестирует, и он всегда успешен, несмотря ни на что.Попробуйте это, но это удастся, чтобы продемонстрировать смысл:
[1].each do |first=nil, second=2|
assert_equal(1, first)
assert_equal(2, second)
end
Позвольте мне объяснить;переменная second
всегда равна 2, независимо от того, как метод each
не влияет на нее, и значение по умолчанию установлено равным 2. В отличие от этого, значение по умолчанию nil
для first
игнорируется, потому что each
передает объект.
Вот улучшенный фрагмент кода для проверки вашего случая.Он проверяет оба случая, когда блок возвращает true и false, и оба случая, когда has_any_context?
- true и false.Я не думаю, что есть общий способ проверить конкретно полученное значение из блока.Вместо этого вы проверяете, что возвращают методы.
# Test: :has_any_context? == true
test_class.stub(:has_any_context?, true) do
# Test: a block must be given.
assert_raises(LocalJumpError) { test_class.show_benefits_section? }
# Test: yield
[true, false, 5].each do |tobe|
# If 5 is given, 5 is returned.
ret = test_class.show_benefits_section? do
tobe
end
assert_equal(tobe, ret)
end
end
# Test: :has_any_context? == false
test_class.stub(:has_any_context?, false) do
ret = test_class.show_benefits_section?{true}
assert_nil(ret)
end
Обратите внимание, что ваш метод show_benefits_section?
возвращает все, что возвращено из блока.Мой пример выше также проверяет это, давая случайное значение, 5. В соглашении Руби, имя метода, заканчивающееся на «?»должен возвращать либо истину, либо ложь (хотя есть исключения вроде FileTest.size?
).Если вы хотите следовать соглашению, возможно, самый простой способ - переписать соответствующую часть следующим образом:
!!yield if has_any_context?
. Вы можете подтвердить, что приведенный выше тест не пройден, как только вы выполните эту модификацию.