2012-08-01 59 views
0

以下測試均通過除了了「它{應be_valid}」行「描述‘發送treatings’做」和「描述‘收到treatings’做」規範驗證失敗

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 

任何幫助表示讚賞!

+0

什麼是你測試的對象嗎?在你的代碼中進行Meating或Treating?你可以發佈它的來源嗎? – bento 2012-08-01 05:05:15

回答

0

在這個測試中,你有兩次會議,只設置他們每個人在固定的兩個ID之一:

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。

再次,出於與您的last question相同的原因,驗證失敗,因爲兩者都只有驗證集中請求的兩個ID中的一個。

你期望的行爲是什麼?如果您想建立與用戶的n:m關係,則必須在某個時間點指定第二個用戶。也許你的意思是像一個夾具:

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

也許你甚至想治療

def send_to(user) 
    requestee = user 
end 

,那麼你可以編寫類似

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

這使我們能創建一個定製的setter用兩個ID進行治療。 (:每個)之前

+0

謝謝(會議從第一個問題做==治療)。之前做sent_treating.requestee = requestee和received_treating.requestor = requestor修復了這個問題。不勝感激! – keypulsations 2012-08-01 12:41:26

0

用正楷

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