Rails - Rspec / Capybara报告失败,除非加入睡眠

时间:2014-10-08 11:38:34

标签: ruby-on-rails rspec capybara

我有一个页面,登录用户可以通过提交调用以下控制器方法的ajax请求来设置收藏项目:

def create
    item = Item.find(params[:id])
    if params[:commit] == 'save'
        item.unhide!(current_user) if item.is_hidden_by?(current_user)
        item.save_as_favourite_for!(current_user)
    else
        item.remove_as_favourite!(current_user) if item.is_favourite_of?(current_user)
        item.hide_for!(current_user)
    end
    respond_to do |format|
     format.html { redirect_back_or items_path }
     format.js {render "create", locals: {item: item, index: params[:index].to_i || nil, page:params[:page]} }
    end
end

这一切都按预期工作,但我有一个请求规范,定义为测试前端功能:

describe "saving items", js: true do

    let!(:current_user) {FactoryGirl.create(:user, email: "user@example.com", active: true)}

    let!(:favourite_item) {FactoryGirl.create(:item)}
    before { sign_in current_user }

    describe "when saving a item" do

        it "should save the user against the item" do

            expect do

                click_button "save"
                # sleep(0.02)

            end.to change(favourite_item.savers, :count).by(1)

        end
    end
end

注意注释掉的睡眠(0.02)声明。如果此语句被注释掉,则测试(几乎)总是失败,但是如果我包含调用,并立即结束控制台中断,则每次测试都会通过。 (任何更多的时间延迟,它失败)。

有没有更好的方法来编写此测试而没有解决方法,为什么它会在没有延迟的情况下失败?

1 个答案:

答案 0 :(得分:0)

您可以使用dsl设置等待时间。

using_wait_time 3 do
  expect do
    click_button "save"
  end.to change(favourite_item.savers, :count).by(1)
end

http://rubydoc.info/github/jnicklas/capybara/Capybara.using_wait_time

如果您使用的是Rspec匹配器,那么JS测试的默认等待时间是2秒,您不参加此测试。

除非你真的需要js驱动程序进行测试,否则你可能会删除js: true