2015-09-06 131 views
1

试图测试一个模块。它在rails控制台中执行时有效,但在写入测试时不起作用。假设以下几点:如何测试Rails模型关联

  1. 为MyModel

    一个)的has_many:my_other_model

  2. MyOtherModel

    一个)属于: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 

作品就好了。但为什么不作为测试?

+1

我认为这个问题是你不创建测试前'MyModel'记录,所以'.first'返回nil,我不知道你怎么做,在MINITEST,但我想你谷歌可以检查。 –

+0

谢谢穆罕默德!是的,问题是我的测试数据库没有记录在dev db中。 –

回答

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 
+0

完美!谢谢。作为新的rails我不知道rails控制台默认为开发数据库,​​而测试去...测试分贝。 –