打开js时功能规格打破:true - Capybara - Rails

时间:2016-11-01 02:03:36

标签: javascript ruby-on-rails ruby capybara

我的应用程序有一些功能规格与水豚。现在我有一个我想要测试的模态。模态使用Javascript。但是当我运行我的规格时。我得到这个非常奇怪的错误。在这里。

错误

Failure/Error: page.driver.browser.set_cookie("account_id=#{account_id}")

 TypeError:
   no implicit conversion of Symbol into Integer
 # /Users/intern/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.11.0/lib/capybara/poltergeist/browser.rb:313:in `[]'
 # /Users/intern/.rvm/gems/ruby-2.3.1/gems/poltergeist-1.11.0/lib/capybara/poltergeist/browser.rb:313:in `set_cookie'
 # ./spec/support/_request_macros.rb:20:in `set_current_account'
 # ./spec/features/manage_accounts_spec.rb:101:in `block (3 levels) in <top (required)>'
 # /Users/intern/.rvm/gems/ruby-2.3.1/gems/rspec-wait-0.0.9/lib/rspec/wait.rb:46:in `block (2 levels) in <top (required)>'

这是破解的文件

def set_current_account(account_id)
 page.driver.browser.set_cookie("account_id=#{account_id}")
end

这是我的测试

测试

 it "redirects to the previous account if a user accesses an account they are not on" do
  third_account = create(:account, name: "Third Account", users: [user])

  set_current_account(third_account.id)
  visit root_path
  expect(current_account).to eq(third_account.id)

  user.accounts.delete(account1)
  click_on "Test Account"

  expect(current_path).to eq(snitches_path)
  expect(page).to have_content("You don't have access to that account!")
  expect(current_account).to eq(third_account.id)
  expect(page).to have_content("Third Account")
end

我在上面的上下文中有js:true。

我真的不知道出了什么问题。希望你们中的一些人更熟悉水豚和javascript测试。让我知道你的想法

1 个答案:

答案 0 :(得分:1)

通过查看你似乎正在使用的恶作剧者https://github.com/teampoltergeist/poltergeist/blob/28cb0d6fd427424acaddc4800514c13efedcb199/lib/capybara/poltergeist/browser.rb,传递的cookie需要是一个哈希 - 而且你不应该在page.driver.browser上调用任何东西(99%的时间意味着你做了一些你不应该做的事情。您可以在set_cookie - https://github.com/teampoltergeist/poltergeist/blob/master/lib/capybara/poltergeist/driver.rb上致电page.driver - 其中包含(名称,值,选项= {})

page.driver.set_cookie("account_id", account_id)

将解决您目前遇到的问题。但是,在page.driver上调用一些东西意味着你可能在50%的时间里做错了。你真的不应该手动设置cookie来伪造登录,而应该是实际登录或设置你正在使用的任何auth库进入测试模式并以这种方式进行(例如,如果使用devise - {{ 3}})

此外,您的测试有许多问题,可能会导致测试不稳定。

  1. visit无法保证在返回之前等待页面完成加载,因此任何基于屏幕上的可见项目之后的断言都可能是不稳定的。
  2. 在JS支持驱动程序中调用current_account(假设这是一个app方法),这意味着单独的线程和您的测试无法访问控制器数据,并不能真正起作用 - 而是只需检查页面上的可见项目。
  3. click_on不会等待它触发的操作完成,所以立即检查后面的路径是非常片状的 - 而是使用将重试的has_current_path匹配器

    期望(页面).to have_current_path(snitches_path)