Метод-заглушка возвращает nil внутри обратного вызова before_create

Я зашел в тупик, тестируя обратный вызов before_create в своих моделях.

Моя спецификация

# The spec
let(:stamp){ mock_model(CompanyStamp) }
let(:signature){ mock_model(CompanyHandwrittenSignature) }
let(:account) { mock_model(Account, :company_handwritten_signature => signature, :company_stamp => stamp) }
it "should have signature if the account has signature" do
  subject.stub :account => account
  subject.stub :save => true
  subject.company_handwritten_signature.should == signature
end

Вот код моей модели

# the model's code
before_create do |element|
  puts "element.account ===> #{element.account.inspect}"  # element has no account! wtf!?
  element.company_handwritten_signature ||= element.account.company_handwritten_signature
  element.company_stamp ||= element.account.company_stamp
  true
end

The before_filter method is being called, but inside that callback, the stubbing of the account method does not seems to work. I've tested

subject.account = account
with identical result. What's going on?

Кстати, я использую rails 2.3 и rspec-rails 1.3.4.


person miguel.camba    schedule 18.11.2011    source источник


Ответы (1)


То, как вы заглушаете методы, выглядит неправильно. Я всегда использовал что-то вроде:

subject.stub(:method).and_return(value)

Вы пробовали этот формат? Кроме того, почему вы ставите заглушки сохранения? Похоже, это может повлиять на некоторое ожидаемое поведение ActiveRecord.

let(:stamp){ mock_model(CompanyStamp) }
let(:signature){ mock_model(CompanyHandwrittenSignature) }
let(:account) { mock_model(Account, :company_handwritten_signature => signature, :company_stamp => stamp) }
it "should have signature if the account has signature" do
  subject.stub(:account).and_return(account)
  subject.stub(:save).and_return(true)
  subject.company_handwritten_signature.should == signature
end
person Peter Brown    schedule 18.11.2011
comment
subject.stub(:method).and_return(value) и subject.stub :account => учетная запись совпадают. Это просто синтаксический сахар, но я использовал длинный синтаксис с тем же результатом. Если действительно сохранить вызов, у меня есть учетная запись, поэтому есть некоторое неожиданное поведение active_record. Когда я сохраняю, вместо этого я получаю ошибку sql: ActiveRecord::StatementInvalid в «TransportDocument INSTANCE METHODS STAMP AND SIGNATURE должен иметь подпись, если у учетной записи есть подпись» Mysql::Error: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает - person miguel.camba; 18.11.2011