2016-01-09 197 views
0

我正在使用React編寫Rails應用程序的測試代碼。 我使用RSpec,水豚,Poltergeist(PhantomJS 2.0)和設計進行身份驗證。RSpec /水豚/ Poltergeist登錄測試失敗

因爲這是一個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 protected]" } 

    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登錄。)

欣賞任何想法。

謝謝!

回答