Poltergeits在rspec测试中表现不佳

时间:2017-02-12 01:36:44

标签: ruby-on-rails rspec-rails poltergeist

我有以下功能测试通过:

require 'rails_helper'

describe "Create a quetsion", type: :feature do
  let(:question) { build(:question) }
  before do
    login_as create(:user, :teacher)
    exercise = create(:exercise)
    visit new_exercise_question_url(exercise.id)
  end

  context "whit valid attributes" do
    subject do
      fill_in "question_score", with: question.score
      fill_in "question_description", with: question.description
      click_on "Criar"
    end

    it "create the question" do
      expect{ subject }.to change(Question, :count).by(1)
      expect(page).to have_current_path(question_path(Question.first.id))
    end
  end

  context "whit invalid attributes" do
    subject do
      click_on "Criar"
    end

    it "doesn't create the exercise" do
      expect{ subject }.to change(Question, :count).by(0)
      expect(page).to have_selector("div.alert.alert-danger")
    end
  end
end

除非我添加js: true,否则工作正常。在这种情况下,我有以下错误:

  1) Create a quetsion whit valid attributes create the question
     Failure/Error: fill_in "question_score", with: question.score

     Capybara::ElementNotFound:
       Unable to find field "question_score"
     # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/node/finders.rb:44:in `block in find'
     # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/node/base.rb:85:in `synchronize'
     # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/node/finders.rb:33:in `find'
     # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/node/actions.rb:85:in `fill_in'
     # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/session.rb:735:in `block (2 levels) in <class:Session>'
     # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/dsl.rb:52:in `block (2 levels) in <module:DSL>'
     # ./spec/features/create_a_question_spec.rb:14:in `block (3 levels) in <top (required)>'
     # ./spec/features/create_a_question_spec.rb:20:in `block (4 levels) in <top (required)>'
     # ./spec/features/create_a_question_spec.rb:20:in `block (3 levels) in <top (required)>'

  2) Create a quetsion whit invalid attributes doesn't create the exercise
     Got 0 failures and 2 other errors:

     2.1) Failure/Error: visit new_exercise_question_url(exercise.id)

          Capybara::Poltergeist::StatusFailError:
            Request to 'http://www.example.com/exercises/1/questions/new' failed to reach server, check DNS and/or server status
          # /usr/local/rvm/gems/ruby-2.3.1/gems/poltergeist-1.13.0/lib/capybara/poltergeist/browser.rb:376:in `command'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/poltergeist-1.13.0/lib/capybara/poltergeist/browser.rb:35:in `visit'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/poltergeist-1.13.0/lib/capybara/poltergeist/driver.rb:97:in `visit'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/session.rb:240:in `visit'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/dsl.rb:52:in `block (2 levels) in <module:DSL>'
          # ./spec/features/create_a_question_spec.rb:8:in `block (2 levels) in <top (required)>'

     2.2) Failure/Error: @socket.send(command.id, command.message, receive_timeout) or raise DeadClient.new(command.message)

          Capybara::Poltergeist::DeadClient:
            PhantomJS client died while processing {"id":"2928bf26-2dd8-45d7-8822-41b2923fd40d","name":"reset","args":[]}
          # /usr/local/rvm/gems/ruby-2.3.1/gems/poltergeist-1.13.0/lib/capybara/poltergeist/server.rb:38:in `send'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/poltergeist-1.13.0/lib/capybara/poltergeist/browser.rb:369:in `command'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/poltergeist-1.13.0/lib/capybara/poltergeist/browser.rb:224:in `reset'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/poltergeist-1.13.0/lib/capybara/poltergeist/driver.rb:183:in `reset!'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/session.rb:109:in `reset!'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara.rb:334:in `block in reset_sessions!'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara.rb:334:in `reverse_each'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara.rb:334:in `reset_sessions!'
          # /usr/local/rvm/gems/ruby-2.3.1/gems/capybara-2.10.1/lib/capybara/rspec.rb:21:in `block (2 levels) in <top (required)>'

我选中了,js: true我的页面html也没有被写入(而不是所需的HTML,我只收到<html><head></head><body></body></html>)。

我添加了poltergeist gem来测试javascritp,并在我的rspec rails_helper.rb文件中配置它:

require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist

PhantomJS已经安装好了,可以在我的$ PATH中使用。我完全没有想法,这里会发生什么?

1 个答案:

答案 0 :(得分:1)

这里有许多潜在的问题。

  1. 如果您设置了Capybara.server = :puma,请确保您没有运行puma 3.7.0,其中有一个错误,将在3.7.1发布时修复。目前使用3.6.9

  2. 如果这是您第一次设置js测试,请确保您已设置并正确配置了DatabaseCleaner,以便您不在js: true测试的事务模式下运行。有关建议的配置,请参阅https://github.com/teamcapybara/capybara#transactions-and-database-setuphttps://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example

  3. 一旦你完成了#1和#2,那么你需要查看你的测试并处理这样一个事实,即在点击/ click_on类型操作后你需要检查是否有可见的页面更改以确保在继续之前,行动已经完成。这是因为点击发生但这些点击触发的操作可以异步发生。在您当前的示例中,这意味着您需要类似

    的内容
    ...
    click_on "Criar"
    expect(page).to have_text("Question created!") #whatever message is shown when the action has completed, or check the page etc.
    
  4. 如果不这样,更改检查将失败,因为它将在实际发生之前检查计数。

    1. 当不需要特定主机名(99.9%的时间)时,默认为_path助手而不是_url助手。这使得Capybara fill_in正在运行的服务器的正确主机/端口。要访问_url帮助程序,需要仔细设置许多配置参数。
    2. 注意:在功能测试中检查数据库计数通常不是最佳做法,它们通常应仅限于检查可见页面更改。