我正在使用Shoulda gem并尝试测试一些私有方法:
it { should respond_to (instance_eval{:get_user_status})}
it { should respond_to (instance_eval{:send_email_notification})}
但是测试失败,因为上述两种方法都是私有的。我该如何使用Shoulda Matchers正确测试其响应能力?
send
进行调用。您可以通过以下方式进行测试:it "tests private methods" do
my_object = MyObject.new
expect(my_object.send(:get_user_status)).to eq 'some_value'
expect(my_object.send(:send_email_notification)).to eq 'some_other_value'
end
可以使用send
测试私有方法...但是您实际上不应该这样做。测试用于确认对象的行为是否符合预期,以便当其他代码(无论是否属于您)使用对象时,您将知道会发生什么。私有方法在您正在创建的类的内部;它们只能在您的类之外的任何地方调用,因此它们应该已经被使用这些私有方法的公共方法的测试间接地行使。实际上,您可以将私有方法视为公共代码的一部分。 Sandi Metz在单元测试中进行了[[great演讲,如果您想了解更多有关单元测试的信息,我建议您观看。讨论私有方法的部分是here。
RSpec::Matchers.define :respond_to_private do |expected|
match do |actual|
actual.respond_to? expected, true
end
description do
prefix = actual.is_a?(Class) ? '.' : '#'
"respond to #{prefix}#{expected}"
end
end
然后在测试中使用它
it { is_expected.to respond_to_private :method }