Rspec与一些私有方法的匹配器

时间:2015-09-28 20:52:06

标签: rspec shoulda

我正在使用shoulda gem并尝试测试一些私有方法:

  it { should respond_to (instance_eval{:get_user_status})}
  it { should respond_to (instance_eval{:send_email_notification})}

但是测试失败了,因为上述方法都是私有的。如何使用shoulda匹配器正确测试他们的响应能力?

3 个答案:

答案 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 }