0

Rolify gemを追加したばかりで、いくつかの rspec テストを実行しています。

2つのテストは次のとおりです。

  describe "roles" do

    before(:each) do
      @user = FactoryGirl.create(:user)
    end

    it "should not approve incorrect roles" do
      @user.add_role :moderator
      @user.has_role? :admin
      should be_false
    end

    it "should approve correct roles" do
      @user.add_role :moderator
      @user.has_role? :moderator
      should be_true
    end

  end

テスト結果は次のとおりです。

  1) User roles should not approve incorrect roles
     Failure/Error: should be_false
       expected: false value
            got: #<User id: nil, email: "", encrypted_password: "", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, confirmation_token: nil, confirmed_at: nil, confirmation_sent_at: nil, name: nil, position: nil, location: nil, admin: false, archived: false, public_email: false, created_at: nil, updated_at: nil>
     # ./spec/models/user_spec.rb:70:in `block (3 levels) in <top (required)>'

Finished in 1.37 seconds
7 examples, 1 failure

Failed examples:

rspec ./spec/models/user_spec.rb:67 # User roles should not approve incorrect roles

Randomized with seed 13074

factory.rb

FactoryGirl.define do

  factory :user do
    sequence(:name)       {|n| "Example User #{n}"}
    sequence(:email)      {|n| "email#{n}@program.com" }
    position              "Regular"
    location              "Anywhere, USA"
    public_email          false
    password              "foobar"
    password_confirmation "foobar"
    confirmed_at          Time.now
  end
end

最初のテストは nil オブジェクトで失敗するのに、2 番目のテストは成功するのはなぜですか?

編集

さらに検査すると、追加されたロールがチェックされたロールと一致するかどうかに関係なく、すべてのテストにshould be_true合格し、すべてのテストに失敗します。should be_false

4

2 に答える 2

3

あなたのテストshould be_trueが起こっていることは、 should 呼び出しがサブジェクトオブジェクトに委譲されていることです(暗黙のレシーバーについてはRSpecのドキュメントを参照してください)。この場合、サブジェクト オブジェクトは、データベースにまだ保存されていない User インスタンスです。user_spec.rb ファイルが で始まる場合describe User do、RSpec はこのデフォルトのサブジェクト User.new を自動的に提供します (暗黙のサブジェクトについては RSpec のドキュメントを参照してください)。

これが意味することは、テストが本質的に行っていることUser.new.should be_trueですUser.new.should be_false. User オブジェクトは常に true と評価されるため、should be_trueテストは常にパスし (ただし、必要な理由ではない可能性があります)、be_false が常に失敗します。

テストの作成方法に基づいて、次のようなことを意味している可能性があります。

describe "roles" do

  before(:each) do
    @user = FactoryGirl.create(:user)
  end

  it "should not approve incorrect roles" do
    @user.add_role :moderator
    @user.has_role?(:admin).should be_false
  end

  it "should approve correct roles" do
    @user.add_role :moderator
    @user.has_role?(:moderator).should be_true
  end

end
于 2012-12-25T06:28:21.173 に答える
1

サンプル グループは、実際には で宣言されたグループにネストされていると想定していdescribe User doます。

問題は、各例の最後の行にshould xxxが示されshouldていますが、レシーバがないため、RSpec が のインスタンスを代用しているUserことです。

あなたが望むものは:

describe User do
  describe "roles" do
    before(:each) do
      @user = FactoryGirl.create(:user)
    end

    it "should not approve incorrect roles" do
      @user.add_role :moderator
      @user.has_role?(:admin).should be_false
    end

    it "should approve correct roles" do
      @user.add_role :moderator
      @user.has_role?(:moderator).should be_true
    end
  end
end

HTH、デビッド

于 2012-12-25T06:28:36.670 に答える