使用rspec / devise登录集成测试
我正在进行集成测试时遇到麻烦,因为用户登录我的rails应用程序,通过。
我正在使用Rspec和capybara,以及设计用户身份validation
这是我的代码:
请求/ authentications_spec.rb
describe 'log in' do before { visit root_path } subject { page } describe 'should be able to log in' do before do user = FactoryGirl.create(:user) fill_in :user_email, with: user.email fill_in :user_password, with: user.password click_on 'Log in' end it { should have_link 'Log out' } end end
工厂/ user_factory.rb
FactoryGirl.define do factory :user do sequence( :first_name ) { |n| "FirstName#{n}" } sequence( :last_name ) { |n| "LastName#{n}" } sequence( :email ) { |n| "foo#{n}@example.com" } password 'foobar' password_confirmation 'foobar' created_at Time.now updated_at Time.now end end
_login_form.html.erb,此表单在应用程序布局标题中呈现。
在布局中我有类似的东西:
if user_signed_in? render 'devise/menu/logout_button' else render 'devise/menu/login_form' end
考试给了我
1) User should be able to log in with valid credentials Failure/Error: it { should have_link 'Log out' } expected link "Log out" to return something # ./spec/requests/authentications_spec.rb:117:in `block (6 levels) in ' Finished in 0.71406 seconds 8 examples, 2 failures, 2 pending
我不明白为什么我的测试没有通过。 有任何想法吗 ?
非常感谢 !
编辑:我得到相同的行为测试注册: expect { click_button register_button }.to change(User, :count).by 1
,测试返回:
Failure/Error: expect { click_button register_button }.to change(User, :count).by 1 count should have been changed by 1, but was changed by 0
所以,我发现了什么不起作用:
describe 'log in' do before { visit root_path } subject { page } describe 'should be able to log in' do before do user = FactoryGirl.create(:user) fill_in :user_email, with: user.email fill_in :user_password, with: user.password click_on 'Log in' end it { should have_link 'Log out' } end
事实上,正确的代码是:
describe 'log in' do before { visit root_path } subject { page } describe 'should be able to log in' do before do user = FactoryGirl.create(:user) fill_in 'user_email', with: user.email fill_in 'user_password', with: user.password click_on 'Log in' end it { should have_link 'Log out' } end end end
似乎Capybara fill_in方法不会将符号作为id的参数,而只是字符串。 傻我。
您未提供符合预期的主题,因此看起来RSpec正在使用最后一个表达式的结果。 最后一个表达式是你的click_button
,它不会返回任何内容。 你什么都不能打电话。
要解决此问题,您只需指定页面应具有所述链接。 我使用Capybara和Selenium-Webdriver,所以对我来说它看起来像page.should have_link...
我的RSpec-fu不够强大,无法知道您是否应该使用page
,或者替换response
, session
或其他内容。