1

レイアウトでレンダリングされたメニュー(部分的に)を持つViewの仕様を書いています。選択したメニューのスペックを書きたい。これがコードです

it "should have User Administration link" do
    template.stub!(:render).and_return(:partial => "layouts/admin/menu")
    do_render
    #render :partial => "layouts/admin/menu" #do
    response.should have_tag('div.menu1')
    response.should have_tag('ul') do
      response.should have_tag('li')do
        with_tag("a[href=?]", admin_users_path)
      end
    end
  end

この仕様は失敗しています。パーシャルの仕様を書く正しい方法が得られていません。私も試してみまし template.should_receive(:render).with(:partial => "/layout/admin/menu")た。

よろしくお願いします、プラビン。

4

2 に答える 2

2

私はこの行を考えていません:

template.stub!(:render).and_return(:partial => "layouts/admin/menu")

あなたがしていると思うことをしている。RSpecはtemplate.render:partial => "layouts / admin/menu"を呼び出しません。レンダリングをスタブアウトし、renderが呼び出されたときに{:partial => "layouts / admin/menu"}を返します。

なぜスタブレンダリングするのですか?ビューを実際にレンダリングして、何かが不足している場合を除いて、応答本文にテストするデータが含まれるようにします。:)

于 2009-12-15T16:57:04.750 に答える
1

これは古い議論だと思いますが、同じような問題を抱えているときに出くわしたので、私の解決策が他の誰かを助けるかもしれません。

私の問題は、「with」が正しくないために、モックされたメソッドが呼び出されなかったことです。これが私が持っていたもので、機能していませんでした:

# widgets/new.html.erb
<% form_for(@widgets) do |f| %>
  <%= render :partial => "form", :locals => {:f => f} %>
  <%= f.submit "Create" %>
<% end %>

# widgets/new.html.erb_spec.rb
describe "widgets/new.html.erb" do
  let(:widget) { @widget ||= Widget.new }
  it "displays a form" do
    template.should_receive(:render).
      with(:partial => "form").
        and_return("<span id=\"rendered-form\"/>")
    render
    response.should have_tag("form[method=?][action=?]", "put", widget_path(widget)) do |form|
      form.should have_tag("span[id=?]", "rendered-form")
      form.should have_tag("input[type=?][value=?]", "submit", "Create")
    end
  end
end

もちろん、なぜそれが機能しなかったのかは明らかです、私は次のように呼んでいました:

render :partial => "form", :locals => {:f => f}

しかし、私のスペックは嘲笑されていました:

render :partial => "form"

当然、私のモックメソッドは呼び出されません。それに気づいたら、form_forやその他のあらゆる種類のものをモックしようとし始めましたが、解決策ははるかに簡単でした。

template.should_receive(:render).
  with(hash_including(:partial => "form")).
    and_return("<span id=\"rendered-form\"/>")

hash_include()が欠けていたものでした。

したがって、おそらくあなたの問題は似ています。あなたは自分が嘲笑していると思うものを実際に嘲笑しているのではありません。

于 2011-01-05T12:45:47.593 に答える