0

次のテストは、「describe "senttreats" do」および「describe "receivedtreats" do」の「it { should be_valid }」行を除いてすべて合格です。

require 'spec_helper'

describe Treating do

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

  before { @received_treating = requestee.received_treatings.build(intro: "Lorem ipsum") }
  before { @sent_treating = requestor.sent_treatings.build(intro: "Lorem ipsum") }

  describe "sent treatings" do
    subject { @sent_treating }
      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 treatings" do
    subject { @received_treating }
      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

  describe "accessible attributes" do
    it "should not allow access to requestor_id" do
      expect do
        Treating.new(requestor_id: requestor.id)
      end.should raise_error(ActiveModel::MassAssignmentSecurity::Error)
    end

    it "should not allow access to requestee_id" do
      expect do
        Treating.new(requestee_id: requestee.id)
      end.should raise_error(ActiveModel::MassAssignmentSecurity::Error)
    end
  end

  describe "when requestor_id is not present" do
    before { @sent_treating.requestor_id = nil }
    it { should_not be_valid }
  end

  describe "when requestee_id is not present" do
    before { @received_treating.requestee_id = nil }
    it { should_not be_valid }
  end
end

エラーは次のとおりです。

Failures:

  1) Treating sent treatings 
     Failure/Error: it { should be_valid }
       expected valid? to return true, got false
     # ./spec/models/treating_spec.rb:19:in `block (3 levels) in <top (required)>'

  2) Treating received treatings 
     Failure/Error: it { should be_valid }
       expected valid? to return true, got false
     # ./spec/models/treating_spec.rb:30:in `block (3 levels) in <top (required)>'

最後に、私の user.rb モデル:

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

  validates :requestor_id, presence: true
  validates :requestee_id, presence: true

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

end

どんな助けでも大歓迎です!

4

2 に答える 2

0

before(:each) ブロックを使用する

before(:each) {
    @received_treating = requestee.received_treatings.build(intro: "Lorem ipsum") 
    @sent_treating = requestor.sent_treatings.build(intro: "Lorem ipsum") 
}
于 2012-08-02T05:28:38.910 に答える
0

このテストでは、2 つの会議があり、それぞれの 2 つの ID のうち 1 つだけをフィクスチャに設定します。

before { @received_treating = requestee.received_treatings.build(intro: "Lorem ipsum") }
before { @sent_treating = requestor.sent_treatings.build(intro: "Lorem ipsum") }

ユーザーが最後の質問と同じであると仮定すると、

class User < ActiveRecord::Base
  ...
  has_many :sent_meetings, :foreign_key => "requestor_id", :class_name => "Meeting"
  has_many :received_meetings, :foreign_key => "requestee_id", :class_name => "Meeting"

@received_treating には requestee_id が必要ですが、requester_id は必要ありません (どこにも割り当てられていません!)。@sent_treating には requestor_id があります。

繰り返しますが、最後の質問と同じ理由で、両方とも検証セットで要求された 2 つの ID のうちの 1 つしか持っていないため、検証は失敗します。

あなたが期待する動作は何ですか?ユーザーと n:m の関係を構築する場合は、ある時点で 2 番目のユーザーを指定する必要があります。多分あなたはそのようなフィクスチャを意味します:

before do 
  @treating = requestor.sent_treatings.build(intro: "Lorem ipsum")
  @treating.requestee = requestee
end

もしかしたら、Treating でカスタム セッターを作成したいかもしれません。

def send_to(user)
  requestee = user
end

次に、次のようなものを書くことができます

before { @sent_treating = requestor.sent_treatings.build(intro: "Lorem ipsum").send_to(requestee) }

これにより、両方の ID が設定された治療が得られます。

于 2012-08-01T05:23:57.817 に答える