Сопоставитель Rspec Shoulda с приватными методами

Я использую драгоценный камень shoulda и пытаюсь проверить некоторые частные методы:

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

Но тесты терпят неудачу, потому что оба вышеуказанных метода являются закрытыми. Как я могу правильно проверить их отзывчивость с помощью соответствующих сопоставителей?


person Jackson Cunningham    schedule 28.09.2015    source источник


Ответы (3)


Чтобы протестировать частный метод, вы должны вызвать его, используя 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
person K M Rakibul Islam    schedule 28.09.2015

Вы можете использовать send для тестирования закрытых методов... но вам действительно не следует этого делать. Тесты используются для подтверждения того, что ваш объект ведет себя так, как вы ожидаете, поэтому, когда другой код, независимо от того, ваш он или нет, использует ваш объект, вы знаете, что произойдет. Закрытые методы являются внутренними для класса, который вы создаете; они не вызываются ниоткуда, кроме вашего класса, поэтому они уже должны быть косвенно проверены тестами для общедоступных методов, которые используют эти частные методы. По сути, вы можете рассматривать свой частный метод как извлечение вашего открытого кода. Санди Мец выступил с отличным докладом о модульном тестировании, который я рекомендую посмотреть, если вы хотите узнать об этом больше; часть, в которой говорится о частных методах, находится здесь.

person Elliot Winkler    schedule 30.09.2015

напишите собственный сопоставитель, например :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 }
person Raúl Cabrera    schedule 08.11.2019