我正在使用shoulda gem并尝试测试一些私有方法:
it { should respond_to (instance_eval{:get_user_status})}
it { should respond_to (instance_eval{:send_email_notification})}
但是测试失败了,因为上述方法都是私有的。如何使用shoulda匹配器正确测试他们的响应能力?
答案 0 :(得分:1)
要测试私有方法,您必须使用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
答案 1 :(得分:0)
你可以使用send
来测试私有方法......但你真的不应该这样做。测试用于确认您的对象以您期望的方式运行,这样当其他代码(无论是否属于您自己的代码)使用您的对象时,您就知道会发生什么。私有方法是您正在创建的类的内部方法;除了你的类之外,它们不能从任何地方调用,因此它们应该已经通过对使用这些私有方法的公共方法的测试进行间接操作。您基本上可以将私有方法视为公共代码的提取。 Sandi Metz在单元测试方面进行了伟大的谈话,如果你想了解更多关于这一点,我建议你观看。谈论私人方法的部分是here。
答案 2 :(得分:0)
编写自定义匹配器,如:respond_to_private示例
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 }