如何测试 Rails 模型关联

How to test Rails model associations

正在尝试测试模块。它在 rails 控制台中执行时有效,但在作为测试编写时无效。假设如下:

  1. 我的模型

    a) has_many :my_other_model

  2. 我的其他模型

    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