【发布时间】:2010-11-11 12:32:11
【问题描述】:
我有一个带有私有方法的模型,我想用 RSpec 来指定,
你平时是怎么做的?
你只测试调用私有方法的方法吗?
还是指定私人的?如果是这样,你怎么办?
【问题讨论】:
标签: ruby-on-rails rspec
我有一个带有私有方法的模型,我想用 RSpec 来指定,
你平时是怎么做的?
你只测试调用私有方法的方法吗?
还是指定私人的?如果是这样,你怎么办?
【问题讨论】:
标签: ruby-on-rails rspec
我总是采用这种方法:我想测试我的班级公开的公共 API。
如果您有私有方法,则只能从公开给其他类的公共方法中调用它们。因此,如果您测试这些公共方法在所有条件下都按预期工作,那么您也证明了它们使用的私有方法也能正常工作。
我承认我遇到过一些特别复杂的私有方法。在那种极端情况下,你想测试它们,你可以这样做:
@obj.send(:private_method)
【讨论】:
send 方法。没有看到任何关于那个的extreme...
@obj.send(:private_method, arg1, arg2)
对于需要代码覆盖(临时或永久)的私有方法,使用rspec-context-private gem 在上下文中临时公开私有方法。
gem 'rspec-context-private'
它通过向您的项目添加共享上下文来工作。
RSpec.shared_context 'private', private: true do
before :all do
described_class.class_eval do
@original_private_instance_methods = private_instance_methods
public *@original_private_instance_methods
end
end
after :all do
described_class.class_eval do
private *@original_private_instance_methods
end
end
end
然后,如果您将 :private 作为元数据传递给 describe 块,则私有方法将在该上下文中公开。
class Example
private def foo
'bar'
end
end
describe Example, :private do
it 'can test private methods' do
expect(subject.foo).not eq 'bar'
end
end
【讨论】:
如果您想测试对私有方法的期望,则接受的答案不会真正起作用(至少我不知道,所以我愿意在这一点上进行更正)。相反,我所做的更加肮脏 - 在测试本身中,只需通过重新定义方法来公开方法:
def object_to_test.my_private_method
super
end
适用于 Ruby 1.8,无法评论任何较新的运行时。
【讨论】: