2012-07-31 48 views
0

我无法通过测试。在我的应用程序中,用户可以有多个他们请求的会议(sent_meetings)以及他们请求的会议(received_meetings)。rspec测试失败:两个“科目”之间的冲突

首先,我(简化)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型号:

meeting.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)两个“主题”行之间的冲突,以及一个覆盖另一个。这是我失败的测试消息:

失败:

1)会议请求 故障/错误:它(:请求者){应==请求者} 预期:# 有:无(使用==) #./spec/models/meeting_spec.rb:15:in`块(2级)在'

在0.67458秒 36个实例成品,1次失败

失败的例子:

rspec的./spec/models/meeting_spec.rb:15#会议请求

我发现有趣的是,我得到这个错误只为要么请求者或请求方(显然有冲突)。两个主题代码块的顺序很重要,当我切换它们时,我会得到与上面相同的错误,但对于'请求者'而不是'请求者'。

我怎样才能通过测试?谢谢!

回答

1

你不能这样做。你必须这样做:

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 

你也可以使用让前,而不是像这样:

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 

它会更快。

+0

很棒,豆。。有用。谢谢!然而,现在我的验证测试失败了(我没有注释'it {should be_valid}')。发送的会议和接受的会议都需要对请求者和被请求者作出回应吗?我尝试过,但他们继续失败。 – keypulsations 2012-07-31 18:48:02

+0

我认为这是另一个问题。请批准我的回答并提出另一个问题。谢谢! – Dougui 2012-07-31 19:14:46