Javascript 打开js:true-Capybara-Rails时特性规范被破坏

Javascript 打开js:true-Capybara-Rails时特性规范被破坏,javascript,ruby-on-rails,ruby,capybara,Javascript,Ruby On Rails,Ruby,Capybara,我有一些功能规格与水豚为我的应用程序。现在我有一个模式,我正在尝试测试。模式使用Javascript。但是当我运行我的规范时。我犯了一个很奇怪的错误。给你 错误 这是我的测验 试验 在上面的上下文中,我有js:true 我真的不知道怎么了。希望你们中的一些人更熟悉水豚和javascript测试。让我知道你是怎么想的,看看你似乎正在使用的恶作剧-传递的cookie需要是散列-你真的不应该在page.driver.browser上调用任何东西(99%的时间意味着你正在做不应该做的事情)。您可以在页面

我有一些功能规格与水豚为我的应用程序。现在我有一个模式,我正在尝试测试。模式使用Javascript。但是当我运行我的规范时。我犯了一个很奇怪的错误。给你

错误 这是我的测验

试验 在上面的上下文中,我有js:true


我真的不知道怎么了。希望你们中的一些人更熟悉水豚和javascript测试。让我知道你是怎么想的,

看看你似乎正在使用的恶作剧-传递的cookie需要是散列-你真的不应该在page.driver.browser上调用任何东西(99%的时间意味着你正在做不应该做的事情)。您可以在
页面上调用
set\u cookie
。driver
-,它接受(name,value,options={})所以

这将解决您当前遇到的问题。然而,在page.driver上调用某些内容意味着大约有50%的时间你可能在做错事。您真的不应该手动将cookie设置为假登录,而是应该实际登录,或者将您正在使用的任何身份验证库设置为测试模式,并以这种方式进行(例如,如果使用designe-)

此外,您的测试还存在许多问题,这些问题可能会导致测试失败

  • visit
    不保证在返回之前等待页面完成加载,因此,任何紧跟其后的断言如果不是基于屏幕上的可见项目,则很可能是不可靠的
  • 在JS支持的驱动程序中调用current_account(假设这是一个应用程序方法),这意味着单独的线程和您的测试没有访问控制器数据的权限,这并不能很好地工作——只需检查页面上的可见项即可
  • 单击\u on
    不会等待它触发的操作完成,因此之后立即检查路径将非常困难-而是使用“拥有当前路径匹配器”,该匹配器将重试

    期望(第页)。具有当前路径(告密路径)

  • 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
    
    page.driver.set_cookie("account_id", account_id)