如何测试 Rails 模型关联
How to test Rails model associations
正在尝试测试模块。它在 rails 控制台中执行时有效,但在作为测试编写时无效。假设如下:
我的模型
a) has_many :my_other_model
我的其他模型
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
Returns:
NoMethodError: NoMethodError: undefined method `my_other_models' for nil:NilClass
现在在控制台中尝试同样的操作:
rails c
MyModule.doit
工作正常。但为什么不作为测试呢?
当你运行这个测试时你的测试数据库是空的,所以调用MyModel.first
会returnnil
,然后你尝试链接一个未知的方法到零。您可能需要的测试套件是 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
正在尝试测试模块。它在 rails 控制台中执行时有效,但在作为测试编写时无效。假设如下:
我的模型
a) has_many :my_other_model
我的其他模型
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
Returns:
NoMethodError: NoMethodError: undefined method `my_other_models' for nil:NilClass
现在在控制台中尝试同样的操作:
rails c
MyModule.doit
工作正常。但为什么不作为测试呢?
当你运行这个测试时你的测试数据库是空的,所以调用MyModel.first
会returnnil
,然后你尝试链接一个未知的方法到零。您可能需要的测试套件是 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