3

Hartl の Rails チュートリアルに従っていますが、devise/cancan/rolify を使用したため、一部が異なります。

私の users_pages_spec.rb テストでは、私が試したにもかかわらず、このエラーが発生し続けます:

1) User pages index delete links as an admin user 
 Failure/Error: sign_in @superadmin
 NoMethodError:
   undefined method `email' for nil:NilClass
 # ./spec/support/utilities.rb:14:in `sign_in'
 # ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

2) User pages index delete links as an admin user 
 Failure/Error: sign_in @superadmin
 NoMethodError:
   undefined method `email' for nil:NilClass
 # ./spec/support/utilities.rb:14:in `sign_in'
 # ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

3) User pages index delete links as an admin user should be able to delete another user
 Failure/Error: sign_in @superadmin
 NoMethodError:
   undefined method `email' for nil:NilClass
 # ./spec/support/utilities.rb:14:in `sign_in'
 # ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

4) User pages index delete links as an admin user 
 Failure/Error: sign_in @superadmin
 NoMethodError:
   undefined method `email' for nil:NilClass
 # ./spec/support/utilities.rb:14:in `sign_in'
 # ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

nil::nilClass は、工場の女の子が実際にこのスーパー管理者ユーザーを作成できなかったことを意味するのですか?

これが私の user_pages_spec.rb ファイルのサンプルです:

require 'spec_helper'
require 'cancan/matchers'

# Test if targeted words appears in displayed content

describe "User pages" do

subject { page }
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
let(:non_admin) { FactoryGirl.create(:user) }
let(:submit) { "Sign in" }

describe "index" do
  describe "delete links" do

  it { should_not have_link('delete') }

  describe "as an admin user" do
    let(:superadmin) { FactoryGirl.create(:superadmin) }
    before do
      sign_in @superadmin
      visit users_path
    end
    it { should have_title('List of users') }

    it { should have_link('delete', href: user_path(User.first)) }
    it "should be able to delete another user" do
      expect { click_link('delete') }.to change(User, :count).by(-1)
    end
    it { should_not have_link('delete', href: user_path(superadmin)) }
  end
end
end
end

sign_in メソッドを定義する私の spec/utilities.rb

include ApplicationHelper

def sign_in(user)
visit new_user_session_path
fill_in "Email",        with: user.email
fill_in "Password", with: user.password
click_button "Login"
#populate cookie when not using capybara
cookies[:authentication_token] = user.authentication_token
end

そして私のspec/factories/user.rb

FactoryGirl.define do
factory :user do
sequence(:name)  { |n| "Person #{n}" }
sequence(:email) { |n| "person_#{n}@example.com"}   
password "beta"
password_confirmation "beta"
# required if the Devise Confirmable module is used
confirmed_at Time.now
confirmation_token nil

factory :superadmin do
  after(:create) {|user| user.add_role(:superadmin)}
end
end

end

cancan/rolify で superadmin ロールを定義しています。

誰かが手がかりを持っているなら、私はそれを取るでしょう!まだここにない場合は、必要な追加ファイルで質問を更新できます。

4

1 に答える 1

4

あなたのlet呼び出しは を設定していますが、設定されていないため、 をsuperadmin参照しています。ところで、これは、初期化されていない場合に参照されたときにサイレントにデフォルト設定されるため、テストでインスタンス変数を一般的に使用しないようにする十分な理由です。@superadminnilnil

于 2013-07-08T22:41:52.533 に答える