Как вы тестируете помощников Rails, которые принимают блок с RSpec? - PullRequest
2 голосов
/ 11 января 2011

С учетом следующего теста RSpec:

  context "items" do
    it "should be able to place links in an expandable menu" do
      output = helper.button("Hello", '#') do
        self.content << helper.item("Test", "example.org")
      end.should include "Test"
    end
  end

И следующего помощника:

 def button(name, url, options = {}, &block)
    if block_given?
      content = with_output_buffer(&block)
      content_tag(:li, :class => 'expandable menu-item') do
        concat link_to(content_tag(:span, name), url, options)
        concat content_tag :div, content, :class => :box
      end
    else
      return content_tag :li, link_to(content_tag(:span, name), url, options), :class => :button
    end
  end

Предполагается, что этот помощник создает кнопку и расширяемое меню, по которому один раз щелкают, если блокдано помощнику кнопки.

Пример просмотра:

= menu do
  = button("Test", '#') do
    %h1 Hello you!

Производит:

<li class="expandable menu-item"><a href="#"><span>Test</span></a><div class="box"><h1>Hello you!</h1> 

Именно то, что я ожидал!После того, как я проверил тест RSpec, он не прошел, и при дальнейшей проверке кажется, что в выводе

<div class="box">...</div>

RSpec ничего не получается:

expected "<li class=\"expandable menu-item\"><a href=\"#\"><span>Hello</span></a><div class=\"box\"></div></li>" to include "Test"

Я пытался поднять содержимое внутри, еслиblock_given?после content = with_output_buffer (& block) и он действительно пуст.Я, должно быть, что-то делаю не так в своем тесте, почему он пуст.

Помощь будет высоко ценится!:)

1 Ответ

4 голосов
/ 11 января 2011

хорошо, я попробую: -)

У вас есть какая-либо конкретная причина использовать with_output_buffer вместо capture?

Вы можете взглянуть на capturesource: ..../gems/actionpack-3.0.3/lib/action_view/helpers/capture_helper.rb, и вы увидите, что он использует with_output_buffer по-другому, чем вы.

Суть в том, что capture может работать с блоками, которые возвращают строку.Итак, с этим вы можете просто использовать:

it "should work" do
  helper.button("Hello", "#") do
    "test"
  end.should include "test"
end

ОБНОВЛЕНИЕ: Ах, я забыл упомянуть, что это будет работать, когда вы измените свой код с:

content = with_output_buffer(&block)

до

content = capture(&block)
...