0

テストに合格できなくて困っています。私のアプリケーションでは、ユーザーは、自分が要求した多くのミーティング (sent_meetings) と、要求されたミーティング (received_meetings) を持つことができます。

まず、私の (単純化された) user.rb モデル:

user.rb

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password

  has_many :sent_meetings, :foreign_key => "requestor_id", :class_name => "Meeting"
  has_many :received_meetings, :foreign_key => "requestee_id", :class_name => "Meeting"
end

そして私の meeting.rb モデル:

ミーティング.rb

class Meeting < ActiveRecord::Base
  attr_accessible :intro, :proposed_date, :proposed_location

  belongs_to :requestor, class_name: "User"
  belongs_to :requestee, class_name: "User"
end

そして私のテスト:

meeting_spec.rb

require 'spec_helper'

describe Meeting do

  let(:requestee) { FactoryGirl.create(:user) }
  let(:requestor) { FactoryGirl.create(:user) }

  before { @received_meeting = requestee.received_meetings.build(intro: "Lorem ipsum") }
  before { @sent_meeting = requestor.sent_meetings.build(intro: "Lorem ipsum") }

  subject { @sent_meeting }
      it { should respond_to(:intro) }
      it { should respond_to(:requestor_id) }
      it { should respond_to(:requestor) }
      its(:requestor) { should == requestor }
      # it { should be_valid }

  subject { @received_meeting }
    it { should respond_to(:intro) }
    it { should respond_to(:requestee_id) }
    it { should respond_to(:requestee) }
    its(:requestee) { should == requestee }
    # it { should be_valid }

end

私の仕様ファイル (@sent_meeting と @received_meeting) の 2 つの「件名」行の間に矛盾があるようで、一方が他方を上書きしています。失敗したテストメッセージは次のとおりです。

失敗:

1) ミーティング リクエスタの失敗/エラー: its(:requestor) { should == requestor } expected: # got: nil (using ==) # ./spec/models/meeting_spec.rb:15:in `block (2 レベル)の '

0.67458秒で完走 36例 失敗1回

失敗した例:

rspec ./spec/models/meeting_spec.rb:15 # 会議のリクエスタ

リクエスタまたはリクエスティのいずれかに対してのみこのエラーが発生したことは興味深いことでした(明らかに競合があります)。2 つのサブジェクト コード チャンクの順序が重要であり、それらを切り替えると、上記と同じエラーが発生しますが、「requestor」ではなく「requestee」に関してです。

どうすればテストに合格できますか? ありがとうございました!

4

1 に答える 1

2

あなたはこれを行うことはできません。これを行う必要があります:

require 'spec_helper'

describe Meeting do

  let(:requestee) { FactoryGirl.create(:user) }
  let(:requestor) { FactoryGirl.create(:user) }

  before { @received_meeting = requestee.received_meetings.build(intro: "Lorem ipsum") }
  before { @sent_meeting = requestor.sent_meetings.build(intro: "Lorem ipsum") }

  describe "sent meetings" do
    subject { @sent_meeting }
    it { should respond_to(:intro) }
    it { should respond_to(:requestor_id) }
    it { should respond_to(:requestor) }
    its(:requestor) { should == requestor }
    it { should be_valid }
  end

  describe "received meetings" do

    subject { @received_meeting }
    it { should respond_to(:intro) }
    it { should respond_to(:requestee_id) }
    it { should respond_to(:requestee) }
    its(:requestee) { should == requestee }
    # it { should be_valid }
  end

end

次のように前に代わりに let を使用することもできます:

require 'spec_helper'

describe Meeting do

  let(:requestee) { FactoryGirl.create(:user) }
  let(:requestor) { FactoryGirl.create(:user) }
  let(:received_meeting) { requestee.received_meetings.build(intro: "Lorem ipsum") }
  let(:sent_meeting) { requestor.sent_meetings.build(intro: "Lorem ipsum") }

  describe "sent meetings" do
    subject { sent_meeting }
    it { should respond_to(:intro) }
    it { should respond_to(:requestor_id) }
    it { should respond_to(:requestor) }
    its(:requestor) { should == requestor }
    it { should be_valid }
  end

  describe "received meetings" do
    subject { received_meeting }
    it { should respond_to(:intro) }
    it { should respond_to(:requestee_id) }
    it { should respond_to(:requestee) }
    its(:requestee) { should == requestee }
    it { should be_valid }
  end

end

それはより速くなります。

于 2012-07-31T16:09:01.063 に答える