Подтвердить что ты не робот

Как указать частный метод

У меня есть модель с приватным методом, который я хотел бы специфицировать с RSpec,
как вы обычно это делаете? Вы только проверяете метод вызова частного?
или также специфицировать частный? если да, как вы поживаете?

4b9b3361

Ответ 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, не может комментировать какие-либо новые версии.