rspec测试ajax响应(应呈现部分)

时间:2011-04-15 16:56:01

标签: ruby-on-rails ruby rspec

我想测试我的控制器操作是否呈现部分。

我已经四处寻找,似乎找不到任何可行的东西。

创建行动:

def create
  @project = Project.new...
  respond_to do |format|
    if @project.save
      format.js { render :partial => "projects/form" }
    end
  end
end

规格:

it "should save and render partial" do
  ....
  #I expected/hoped this would work
  response.should render_partial("projects/form")
  #or even hopefully
  response.should render_template("projects/form")
  #no dice
end

3 个答案:

答案 0 :(得分:48)

如果你正在寻找一个真实的答案......(即完全在RSpec而不是使用Capybara),RSpec文档说render_template是assert_template的包装器。 assert_template(according to the docs)还表示您可以通过包含:partial key来检查部分是否已呈现。

放手一搏......

it { should render_template(:partial => '_partialname') }

答案 1 :(得分:2)

更新 请参阅下面的bluefish的回答,这似乎是正确答案

您是否考虑使用Capybara进行集成测试?我发现ajax难以单独使用rspec进行测试。在你的情况下,我甚至不确定你是否收到回复。在capybara,它等待ajax调用完成,你可以调用page.has_xxxx来查看它是否已更新。这是一个例子:

it "should flash a successful message" do
    visit edit_gallery_path(@gallery)
    fill_in "gallery_name", :with => "testvalue"
    click_button("Update")
    page.has_selector?("div#flash", :text => "Gallery updated.")
    page.has_content?("Gallery updated")
    click_link "Sign out"
end

答案 2 :(得分:1)

测试ajax控制器方法的另一个好方法是检查稍后用于呈现结果的分配。这是一个小例子:

控制器

def do_something
  @awesome_result = Awesomeness.generete(params)
end

的JBuilder

json.(@awesome_result, :foo, :bar)

Rspec控制器测试

describe :do_something do

  before do
    @valid_params{"foo" => "bar"}
  end

  it "should assign awesome result" do
    xhr :post, :do_something, @valid_params
    assigns['awesome_result'].should_not be_nil
  end

end