Стабильный метод возвращает nil в обратном вызове before_create - PullRequest
1 голос
/ 18 ноября 2011

Я в тупике, тестирую обратный вызов 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

Вызывается метод before_filter, но внутри этого обратного вызова заглушка метода account не работает. Я протестировал

subject.account = account
с идентичным результатом. Что происходит?

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

1 Ответ

0 голосов
/ 18 ноября 2011

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

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
...