我有一个页面,登录用户可以通过提交调用以下控制器方法的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)声明。如果此语句被注释掉,则测试(几乎)总是失败,但是如果我包含调用,并立即结束控制台中断,则每次测试都会通过。 (任何更多的时间延迟,它失败)。
有没有更好的方法来编写此测试而没有解决方法,为什么它会在没有延迟的情况下失败?
答案 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
。