簡體   English   中英

如何測試使用RSpec接受塊的Rails助手?

[英]How do you test Rails helpers which accepts a block with RSpec?

進行以下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)之后,它確實為空。 我在測試中必須做錯什么,為什么它是空的。

幫助將不勝感激! :)

好,我會試試 :-)

您是否有任何特定的原因使用with_output_buffer而不是capture

您可以查看capture源: ..../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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM