0

Railsアプリケーションでのユーザーログインの統合テストに問題があります。

Rspecとカピバラを使っており、ユーザー認証も工夫しています

これが私のコードです:

requests/authentication_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

factory/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、このフォームはアプリケーション レイアウト ヘッダーにレンダリングされます。

<%= form_for(resource, as: resource_name, url: session_path(resource_name), html: { id: 'login-mini-form' }) do |f| %>
  <%= f.email_field :email,       placeholder: 'Your email' %>
  <%= f.password_field :password, placeholder: '******' %>
  <%= f.submit "Log in", id: 'login-button' %>

  <%- if devise_mapping.rememberable? -%>
    <%= f.check_box :remember_me %> <%= f.label :remember_me %>
  <%- end -%>

<% end %>

レイアウトには次のようなものがあります:

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 <top (required)>'

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
4

2 に答える 2

1

だから、私は何が機能していないかを見つけました:

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 の引数としてシンボルを使用せず、文字列のみを使用しているようです。愚かな私。

于 2012-07-04T11:07:29.010 に答える
0

期待どおりの件名を指定しなかったため、RSpecは最後の式の結果を使用しているようです。その最後の式はyourclick_buttonであり、何も返しません。あなたは何も要求することはできませshouldん。

これを修正するには、ページに上記のリンクが含まれていることを指定する必要があります。私はCapybaraとSelenium-Webdriverを使用しているので、私にとってはのように見えますpage.should have_link...page私のRSpec-fuは、あなたも使うべきか、それともresponse、、、sessionまたは何か他のものを使うべきかを知るのに十分なほど強力ではありません。

于 2012-07-03T23:57:18.840 に答える