Как определить частный метод - PullRequest
52 голосов
/ 11 ноября 2010

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

Ответы [ 3 ]

116 голосов
/ 11 ноября 2010

Я всегда придерживаюсь этого подхода: Я хочу протестировать публичный API, предоставляемый моим классом.

Если у вас есть закрытые методы, вы вызываете их только из открытых методов, которые вы предоставляете другим классам. Следовательно, если вы проверяете, что эти публичные методы работают должным образом при любых условиях, вы также доказали, что частные методы, которые они используют, также работают.

Я признаю, что сталкивался с некоторыми особенно сложными частными методами. В этом крайнем случае, если вы хотите проверить их, вы можете сделать это:

@obj.send(:private_method)
6 голосов
/ 24 мая 2014

Для частных методов, которым требуется покрытие кода (временно или постоянно), используйте 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
0 голосов
/ 05 октября 2017

Если вы хотите проверить ожидание по частному методу, принятый ответ на самом деле не сработает (по крайней мере, не так, как я знаю, поэтому я открыт для исправления в этом вопросе).Вместо этого я сделал еще более грязную работу - в самом тесте просто выставьте метод, переопределив его:

def object_to_test.my_private_method
  super
end

Работает на Ruby 1.8, не может комментировать ни одну из более новых сред выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...