Rspec 在 rails 应用程序中测试私有模型方法
Rspec test of private model method in rails app
我的 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: #< Class:......>
的未定义方法“my_vital_method”
问题:如何在rspec中调用私有模型方法?
根据定义,您不能从 class 外部调用私有方法,因为它们是 私有的。
对你来说幸运的是,如果你使用 object.send(:my_vital_method)
跳过方法调用限制的测试,你可以做你想做的事。
现在,更大的问题是您确实让您的对象变得更脆弱,因为像这样从外部调用可能需要实现细节,随着时间的推移这些细节将与 class 不同步。您实际上是在增加对象 API.
最后,如果你试图防止篡改,那么你就是在向风车倾斜——你不能在 Ruby 因为我可以简单地重新定义你的方法并确保如果我的新方法被调用从你的防篡改检查代码,我调用原始版本,否则我做我的邪恶的事情。
祝你好运。
如果您的私有方法需要测试,它可能应该是另一个 class 的 public 方法。如果你找到这个 class 的名称,定义它的用途,然后创建你想要的方法签名,你最终会得到类似
的东西
def my_vital_method
MyVitalClass.new.do_stuff
end
现在您可以为 do_stuff 编写规范了。
我的 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: #< Class:......>
的未定义方法“my_vital_method”问题:如何在rspec中调用私有模型方法?
根据定义,您不能从 class 外部调用私有方法,因为它们是 私有的。
对你来说幸运的是,如果你使用 object.send(:my_vital_method)
跳过方法调用限制的测试,你可以做你想做的事。
现在,更大的问题是您确实让您的对象变得更脆弱,因为像这样从外部调用可能需要实现细节,随着时间的推移这些细节将与 class 不同步。您实际上是在增加对象 API.
最后,如果你试图防止篡改,那么你就是在向风车倾斜——你不能在 Ruby 因为我可以简单地重新定义你的方法并确保如果我的新方法被调用从你的防篡改检查代码,我调用原始版本,否则我做我的邪恶的事情。
祝你好运。
如果您的私有方法需要测试,它可能应该是另一个 class 的 public 方法。如果你找到这个 class 的名称,定义它的用途,然后创建你想要的方法签名,你最终会得到类似
的东西def my_vital_method
MyVitalClass.new.do_stuff
end
现在您可以为 do_stuff 编写规范了。