validates_associated и validates_presence_of не работают должным образом с rspec? - PullRequest
6 голосов
/ 15 апреля 2009

У меня есть модель пользователя и модель дружбы.

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

и один из моих rspec-тестов

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

Тест не должен быть действительным, потому что нет пользователя с user_id 9999. Но тест говорит, что модель дружбы действительна.

Какого черта?

EDIT:

Но я хочу проверить, как упомянуто -> без назначения отправителя напрямую. Разве это не возможно?

Ответы [ 4 ]

11 голосов
/ 16 апреля 2009

Если вы хотите, чтобы ваша модель работала таким образом, измените это:

validates_presence_of :receiver_id, :sender_id

к этому:

validates_presence_of :receiver, :sender
2 голосов
/ 16 апреля 2009

Существует также старый плагин, который делает это ... validates_existence_of.

http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

2 голосов
/ 15 апреля 2009

Документация Rails для validates_associtated гласит следующее:

ПРИМЕЧАНИЕ. Эта проверка не завершится неудачей, если связь не была назначена. Если вы хотите убедиться, что ассоциация присутствует и гарантированно действительна, вам также необходимо использовать validates_presence_of.

Вы не назначили ассоциацию. Измените ваш тест следующим образом, и он должен пройти:

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 голос
/ 15 апреля 2009

Хм ..

после того, как я нашел только эту запись в блоге и wont-fix-ticket в маяке рельсов:

Запись в блоге с решением

Маяк-привычка затруднительного билет

я переключился на собственное решение:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...