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

Должен ли я тестировать частные методы с помощью RSpec?

Хорошо ли писать тесты для частных методов?

Рассмотрим следующий простой пример:

class Group
  has_many :members

  private

  def release_members
    members.each { |member| member.update_attributes group_id: nil }
  end
end

Было бы хорошей практикой написать тест для метода release_members в RSpec? Я считаю, что вам нужно будет написать тест, вызывающий метод, с помощью send ie. group.send(:release_members), на который иногда помешают.

4b9b3361

Ответ 1

Вы можете найти подробное обсуждение этой темы в этих слайдах из беседы Санди Меца.

https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf

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

Я думаю, что точка toch, по расщеплению сервиса и объекта ценности и сдачи тестируемых тоже хороша, если вы нервничаете о сложных частных методах, которые не тестируются.

Ответ 2

Вам не следует проверять частные методы, поскольку они принадлежат внутреннему механизму класса. Целью Unit Tests является проверка того, что ваш класс ведет себя так, как ожидалось, при взаимодействии через его интерфейс, т.е. Его общедоступные методы.

Если в определенный момент вам не нравятся длинные частные методы, это, вероятно, потому, что у вас есть возможность вытащить эту логику за пределы класса и построить другой модуль или класс. Затем вы можете unit test его, снова только его интерфейс, т.е. Его общедоступные методы.

В некоторых редких случаях необходимо проверить частные методы, потому что вся внутренняя логика очень сложна, и вы хотите разделить проблему. Но в 99,9% тестирование частных методов - плохая идея.

Ответ 3

создайте фиктивный класс и получите доступ к приватному методу, используя .send(: private_method, args)

пример

obj = Class.new {extension AppHelper} obj.send(: сумма, 1,2)