У меня есть модель с приватным методом, который я хотел бы специфицировать с RSpec,
как вы обычно это делаете?
Вы только проверяете метод вызова частного?
или также специфицировать частный? если да, как вы поживаете?
Как указать частный метод
Ответ 1
Я всегда придерживаюсь такого подхода: я хочу проверить публичный API, который предоставляет мой класс.
Если у вас есть частные методы, вы вызываете их только из общедоступных методов, которые вы публикуете для других классов. Следовательно, если вы проверите, что эти общедоступные методы работают как ожидалось при любых условиях, вы также доказали, что частные методы, которые они используют, также работают.
Я признаю, что столкнулся с некоторыми особенно сложными частными методами. В этом крайнем случае вы хотите проверить их, вы можете сделать это:
@obj.send(:private_method)
Ответ 2
Для частных методов, требующих покрытия кода (временно или постоянно), используйте 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
Ответ 3
Если вы хотите проверить ожидания на приватном методе, принятый ответ действительно не работает (по крайней мере, не тот, о котором я знаю, поэтому я открыт для исправления в этой точке). То, что я сделал, является еще более грязным - в самом тесте просто выставляйте метод, переопределяя его:
def object_to_test.my_private_method
super
end
Работает на Ruby 1.8, не может комментировать какие-либо новые версии.