尝试测试模块。它在rails控制台中执行时有效,但在编写为测试时则无效。假设如下:
MyModel
a)has_many:my_other_model
MyOtherModel
a)属于:my_model
模块示例:
module MyModule
def self.doit
mine = MyModel.first
mine.my_other_models.create!(attribute: 'Me')
end
end
现在测试:
require 'test_helper'
class MyModuleTest < ActiveSupport::TestCase
test "should work" do
assert MyModule.doit
end
end
返回:
NoMethodError: NoMethodError: undefined method `my_other_models' for nil:NilClass
现在在控制台中尝试相同的事情:
rails c
MyModule.doit
工作得很好。但为什么不作为测试?
答案 0 :(得分:0)
运行此测试时,您的测试数据库为空,因此调用MyModel.first
将返回nil
,然后您尝试将未知方法链接到nil。您可能想要的测试套件是fixture,它只是示例数据。现在,您可以创建第一个实例以使测试工作。
test "should work" do
MyModel.create #assuming the model is not validated
assert MyModule.doit
end
你也可以重构你的模块。添加if mine
只会尝试创建其他模型,如果我的不是零。这将使测试通过,但否定了测试的目的。
def self.doit
mine = MyModel.first
mine.my_other_models.create!(attribute: 'Me') if mine
end