我在使用rspec和rails运行测试时遇到了意外行为。我有一个类方法create_and_save
,它保存了与recipient
对象的关联。
如果在此方法的任何一点,我输出recipient
,我得到了我期望的结果:
Rails.logger.debug recipient.to_s
# => #<User:0x007fb712572210>
但是一旦我尝试访问recipient
上的属性或方法,我就会遇到错误。
Rails.logger.debug recipient.id.to_s
# => undefined method `id' for nil:NilClass
Rails.logger.debug recipient.valid?.to_s
# => undefined method `valid?' for nil:NilClass
如果我检查nil?
,行为遵循类似的模式。没有其他电话,我很好:
Rails.logger.debug recipient.nil?.to_s
# => false
但是当我尝试访问某个方法时,recipient
会追溯nil
。
Rails.logger.debug recipient.nil?.to_s
# => true
Rails.logger.debug recipient.id.to_s
# => undefined method `id' for nil:NilClass
在开发中,该方法按预期工作。所以我猜这与我的测试环境如何运行有关,但我不确定在哪里看。
答案 0 :(得分:1)
确保您的数据库在测试环境中是最新的。
最简单的方法是使用以下命令重新创建测试数据库:
RAILS_ENV=test rake db:drop db:create db:migrate
答案 1 :(得分:0)
在努力为我的问题添加更多上下文时,我找到了罪魁祸首。该方法被调用两次。第一次recipient
确实nil
,而第二次第二次运行时,它有一个收件人。
nil
对象的验证和更好的检查可能很快就会发现。
我还会注意到,当我没有尝试访问属性时,我认为Rails.logger.debug recipient.nil?.to_s
返回false
的原因是因为这是我在事务结束时看到的。因为初始调用发生在几个事务的中间,它在混乱中丢失了。使用puts
打印到运行rspec的窗口使这更容易调试。