2009-04-15 25 views
6

Tôi có Mô hình người dùng và Mô hình hữu nghị.validates_associated và validates_presence_of không hoạt động như mong đợi với rspec?

class Friendship < ActiveRecord::Base 
    belongs_to :sender, :class_name=>'User', :foreign_key=>'sender_id' 
    belongs_to :receiver, :class_name=>'User', :foreign_key=>'receiver_id' 

    validates_presence_of :receiver_id, :sender_id 
    validates_associated :receiver, :sender 
end 

class User < ActiveRecord::Base 
    has_many :sent_friendships, :class_name => "Friendship", :foreign_key => "sender_id", :dependent => :destroy 
    has_many :received_friendships, :class_name => "Friendship", :foreign_key => "receiver_id", :dependent => :destroy 
end 

và là một trong rspec-thử nghiệm của tôi là

describe Friendship do 

    before(:each) do 
    @valid_attributes = { 
     :sender_id => 1, 
     :receiver_id => 2, 
     :accepted_at => nil 
    } 
    end 

    it "should not be valid with non-existant receiver_id" do 
    f = Friendship.new(@valid_attributes) 
    f.receiver_id = 99999 
    f.should_not be_valid 
    end 
end 

Xét nghiệm này không nên có giá trị, vì không có người dùng với user_id 9999. Tuy nhiên, thử nghiệm nói là quan hệ hữu nghị mô hình là hợp lệ.

Tại sao địa ngục?

EDIT:

Nhưng tôi muốn kiểm tra như đã đề cập -> mà không gán cho người gửi trực tiếp. Không phải là có thể ??

Trả lời

11

Nếu bạn muốn mô hình của bạn để làm việc theo cách đó, thay đổi này:

validates_presence_of :receiver_id, :sender_id 

này:

validates_presence_of :receiver, :sender 
+0

Không tạo sự khác biệt. Hoạt động trong giao diện điều khiển, không hoạt động với thử nghiệm (ít nhất là không sử dụng đồ đạc) – Espen

+0

AFAIK, validates_presence_of trên tên liên kết chỉ hoạt động như mong đợi khi đối tượng là bản ghi mới. Nếu bạn đang lấy ra một fixture hiện có từ db và sửa đổi receiver_id trực tiếp, sau đó kiểm tra này sẽ thất bại, trừ khi bạn thiết lập receiver đến nil trước. –

2

Các Rails tài liệu cho validates_associtated tiểu bang sau đây:

LƯU Ý: xác nhận này sẽ không thất bại nếu hiệp hội chưa được giao. Nếu bạn muốn đảm bảo rằng liên kết vừa hiện diện vừa bảo đảm hợp lệ, bạn cũng cần sử dụng validates_presence_of.

Bạn không được chỉ định liên kết. Sửa đổi thử nghiệm của bạn như sau và nó sẽ vượt qua:

it "should not be valid with non-existant receiver_id" do 
    f = Friendship.new(@valid_attributes) 
    f.receiver_id = 99999 
    f.receiver = nil # Note this line 
    f.should_not be_valid 
end 
1

Hm ..

sau khi tôi tìm thấy chỉ này blog entry và một-sửa chữa-vé sẽ không ở đường ray Lighthouse:

Blog-entry with solution

Lighthouse-wont-fix-ticket

tôi chuyển sang giải pháp của riêng mình:

class Friendship < ActiveRecord::Base 
    belongs_to :sender, :class_name=>'User', :foreign_key=>'sender_id' 
    belongs_to :receiver, :class_name=>'User', :foreign_key=>'receiver_id' 

    validates_presence_of :receiver_id, :sender_id 

    validate :sender_exists 
    validate :receiver_exists 

    protected 
    def sender_exists 
    errors.add("sender_id", "not existant") unless User.exists?(self.sender_id) 
    end 
end 
Các vấn đề liên quan