使用RSpec / Capybara / Poltergeist登录测试失败

时间:2016-01-09 15:19:40

标签: ruby-on-rails rspec devise reactjs capybara

我正在使用React为Rails应用程序编写测试代码。 我正在使用RSpec,Capybara,Poltergeist(PhantomJS 2.0)和Devise进行身份验证。

因为这是一个javascript测试,我也使用了建议here的database_cleaner gem。 测试运行时,我可以看到用户数据进入数据库(mysql),Devise方法user.valid_password?("password")返回true,但测试失败。

spec_helper.rb

RSpec.configure do |config|

  config.use_transactional_fixtures = false

  Capybara.register_driver :poltergeist do |app|
    options = {
      inspector: true,
      js_errors: false,
      #debug: true,
      phantomjs_options: %w[
        --web-security=no
        --ignore-ssl-errors=yes
        --ssl-protocol=any
      ]
    }
    Capybara::Poltergeist::Driver.new(app, options)
  end

  Capybara.javascript_driver = :poltergeist

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end
  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end
  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end
  config.before(:each) do
    DatabaseCleaner.start
  end
  config.after(:each) do
    DatabaseCleaner.clean
  end

end

规范看起来像这样。

require 'spec_helper'

feature 'Registration', js: true do
  let!(:email) { "email@test.com" }

  scenario "user can sign up and log in" do
    visit 'sign_up'
    find('input').set(email)
    find('.submit').click
    expect(page).to have_content('welcome!')

    visit '/sign_out'
    visit '/sign_in'

    expect(page).to have_content('Login')
    find('input[name="email"]').set(email)
    find('input[name="password"]').set('password')
    find('.submit').click
    wait_for_ajax

    expect(page).to have_content('Test User')
  end

end

API看起来像这样。

post do
  email = params[:email]
  password = params[:password]

  if email.nil? or password.nil?
    return error!(['this is error'], 401)
  end

  user = User.where(email: email.downcase).first
  if user.nil?
    return error!(['this is error'], 401)
  end
  if !user.valid_password?(password)
    return error!(['this is error'], 401)
  else
    user.ensure_authentication_token
    user.save
    return { status: 'ok', results: { access_token: user.authentication_token } }
  end
end

我使用PhantomJS 2.0获得如下所示的日志。

API.ajax:POST /sessions
API.ajax:POST /sessions
API.ajax:POST /sessions :failed
httpStatus:401
error
[object Object]
API.ajax:POST /sessions :failed
httpStatus:401
error
[object Object]

因此在身份验证过程中出现了问题,但只有在我运行测试时才会发生。 (我可以注册并使用Chrome或Firefox登录。)

欣赏任何想法。

谢谢!

1 个答案:

答案 0 :(得分:0)

事实证明,当我运行测试时,某些功能是指HARD CODED端口3000。

rspec - Running rails server changes test result? - Stack Overflow

我不知道为什么它是这样构建的,但至少现在我可以通过添加Capybara设置来运行我的测试: Capybara.server_port = 3000

谢谢!