Ruby on rails Stubbed方法在before_create回调中返回nil

Ruby on rails Stubbed方法在before_create回调中返回nil,ruby-on-rails,ruby,callback,rspec,stubbing,Ruby On Rails,Ruby,Callback,Rspec,Stubbing,在我的模型中创建回调之前,我正在测试一个死胡同 我的规格 # The spec let(:stamp){ mock_model(CompanyStamp) } let(:signature){ mock_model(CompanyHandwrittenSignature) } let(:account) { mock_model(Account, :company_handwritten_signature => signature, :company_stamp => stamp)

在我的模型中创建回调之前,我正在测试一个死胡同

我的规格

# 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,结果相同。发生什么事了


顺便说一句,我使用的是rails 2.3和rspec rails 1.3.4,您使用的存根方法看起来不太正确。我总是使用一些类似于:

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
subject.stub(:method.)和_return(value)和subject.stub:account=>account是相同的。它只是语法糖,但我使用了长语法,得到了相同的结果。如果真的调用save,我就拥有该帐户,因此会出现一些意外的活动记录行为。当我保存时,我得到一个sql错误:ActiveRecord::StatementInvalid in'TransportDocument实例方法STAMP AND SIGNATURE应具有签名如果帐户具有签名'Mysql::错误:无法添加或更新子行:外键约束失败
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