如何测试Rails模型关联

时间:2015-09-06 14:26:54

标签: ruby-on-rails activesupport

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

  1. MyModel

    a)has_many:my_other_model

  2. MyOtherModel

    a)属于:my_model

  3. 模块示例:

    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
    

    工作得很好。但为什么不作为测试?

1 个答案:

答案 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