2012-08-01 80 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") 
}