rails app中私有模型方法的Rspec测试

时间:2017-07-18 16:00:55

标签: ruby-on-rails rspec rspec-rails

我的rails应用程序中有一个私有模型方法,它对生活质量至关重要,因为我们知道我想使用rspec对其进行测试,以便在将来的篡改改变它的工作原理时发出嘎嘎声。

class MyModel < ApplicationRecord
    belongs_to something
    has_many somethings

    after_create :my_vital_method

    validates :stuff

    private
    def my_vital_method
        #do stuff
    end
end

当我尝试在rspec测试中调用该方法时,我收到以下错误消息:

NoMethodError:未定义的方法`my_vital_method'for#&lt;类:......&GT;

问题:如何在rspec中调用私有模型方法?

2 个答案:

答案 0 :(得分:1)

根据定义,您不能从类外部调用私有方法,因为它们是私有

幸运的是,如果您使用object.send(:my_vital_method)来跳过测试方法调用限制,则可以执行您想要的操作。

现在,更大的问题是你真的让你的对象更加脆弱,因为从外部调用可能需要实现细节,这些细节随着时间的推移会与类不同步。您正在有效地增加Object API。

最后,如果你试图防止篡改,那么你正在倾向于风车 - 你不能在Ruby中因为我可以简单地重新定义你的方法并确保如果我的新方法是从你的反篡改检查中调用的代码,我称之为原始版本,否则我会做我的恶意。

祝你好运。

答案 1 :(得分:0)

如果您的私有方法需要测试,它可能应该是另一个类的公共方法。如果你发现这个类的名字定义了它的目的,然后创建你想要的方法签名,你最终会得到像

这样的东西。
def my_vital_method
  MyVitalClass.new.do_stuff
end

现在您可以为do_stuff编写规范。