2012-07-31 67 views
0

我有一個meeting.rb和user.rb模型rspec的失敗驗證

meeting.rb

class Meeting < 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 

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" 

我無法弄清楚如何防止我的meeting_spec .rb驗證失敗。出於某種原因,我的sent_meetings或requested_meetings(類會議)沒有鏈接到它們各自的請求者或請求者(類用戶)(最後兩個代碼塊,「當requestor_id不存在時」,「當requestee_id不存在時」)。

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") } 

    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 

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

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

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

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

這裏是RSpec的錯誤,我得到:

Failures: 

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

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

Finished in 0.77435 seconds 
42 examples, 2 failures 

Failed examples: 

rspec ./spec/models/meeting_spec.rb:17 # Meeting sent meetings 
rspec ./spec/models/meeting_spec.rb:26 # Meeting sent meetings 

會很感激,就如何使會議和用戶之間的關聯(請求,被請求方)任何輸入( sent_meeting,requested_meeting)。

謝謝!

回答

0
在模型中

你的要求都IDS的存在與

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

所以如果你NIL其中一個作爲您的規範

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

它們是無效的,無效的,因爲你在這種情況下宣稱他們不是有效的。

+0

是的,這是完全正確的,它應該是{should_not be_valid}。然而,他們都失敗了,我發現這很奇怪。有任何想法嗎? – keypulsations 2012-08-01 00:27:33

+0

這種情況下的信息是什麼? – bento 2012-08-01 00:30:53

+0

將最後兩次驗證測試更改爲{should_not be_valid}。 「發送會議描述」和「描述接收到的會議」中的驗證失敗:失敗: 1)會議發送會議 失敗/錯誤:它應該是有效的 預計有效嗎?返回true,得到虛假 #./spec/models/meeting_spec.rb:17:in ' 2)會議接收到的會議 失敗/錯誤:it {should be_valid} 預計有效嗎?返回true,得到錯誤 #./spec/models/meeting_spec.rb:26:in'block(3 levels)in ' – keypulsations 2012-08-01 00:52:21