在Rails测试环境

时间:2016-01-04 11:24:33

标签: ruby-on-rails ruby rspec

我在使用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

在开发中,该方法按预期工作。所以我猜这与我的测试环境如何运行有关,但我不确定在哪里看。

2 个答案:

答案 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的窗口使这更容易调试。