使用RSpec / Capybara / Poltergeist登录测试失败 [英] Log in test fails with RSpec / Capybara / Poltergeist

查看:183
本文介绍了使用RSpec / Capybara / Poltergeist登录测试失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



由于这是一个JavaScript测试,我也使用database_cleaner宝石建议这里
当测试运行时,我可以看到用户数据进入数据库(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'

功能'注册',js:true do
let!(:email){email@test.com}

情景用户可以注册并登录do
访问'sign_up'
find('input')。set(email)
find('。submit')。点击
expect(page).to have_content('welcome!')

访问'/ sign_out'
访问'/ sign_in'

期望(页).to have_content('登录')
find('input [ set('password')
find('。submit')。click('。submit')。
wait_for_ajax

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

end

API看起来像这样。

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

如果email.nil?或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
错误
[object Object]
API.ajax:POST / sessions:failed
httpStatus:401
error
[object Object ]

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



欣赏任何想法。



谢谢!

解决方案

事实证明,一些功能参考HARD CODED端口3000当我运行测试..



rspec - 运行rails服务器更改测试结果? - 堆栈溢出



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



谢谢!


I'm writing test code for Rails application with React. I'm using RSpec, Capybara, Poltergeist(PhantomJS 2.0) and Devise for authentication.

Because this is a javascript test, I'm also using database_cleaner gem as suggested here. When test runs I can see user data goes into database(mysql) and Devise method user.valid_password?("password") returns true, however, test fails.

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

The spec looks like this.

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 looks like this.

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

I get log like below with 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]

So something went wrong in authentication process but it only happens when I run test. (I can sign up and log in with Chrome or Firefox.)

Appreciate any idea.

Thanks!

解决方案

It turned out some functionality refers HARD CODED port 3000 when I run test..

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

I don't know why it's built like that but at least for now I can run my test by adding Capybara setting: Capybara.server_port = 3000

Thanks!

这篇关于使用RSpec / Capybara / Poltergeist登录测试失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆