функциональный тест для контроллера рельсов частным методом - PullRequest
3 голосов
/ 28 апреля 2010

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

Но когда я пытаюсь написать тестовый пример для этого метода, то он срабатывает при доступе (переменная сеанса и параметры) в моем функционале, все остальные методы работают нормально, проблема только в приватном методе?

В моем методе настройки в функциональном тесте я также устанавливаю сессию .?

Ответы [ 3 ]

3 голосов
/ 28 апреля 2010

Вам следует избегать тестирования частных методов. «Цель» использования открытых / закрытых / защищенных методов состоит в том, чтобы инкапсулировать логику и упростить изменение частей кода, не беспокоясь о том, как одна функция или класс взаимодействует с другой.

При этом, если вы все еще чувствуете необходимость проверить свои частные методы, есть обходные пути. Я нашел эту полезную функцию через блог Джея Филда :

class Class
  def publicize_methods
    saved_private_instance_methods = self.private_instance_methods
    self.class_eval { public *saved_private_instance_methods }
    yield
    self.class_eval { private *saved_private_instance_methods }
  end
end

Проверьте ссылку на подробности использования, кажется, быстрый и простой способ сделать то, что вы хотите сделать.

1 голос
/ 28 апреля 2010

Мне нравится предложение Дэмиена Уилсона . Я повторяю его заявление, что вы «должны избегать тестирования частных методов». При необходимости я объявляю публичную версию метода:

class FooTest < Test::Unit::TestCase
  Foo.class_eval do
    def public_bar(*args, &block)
      private_bar(*args, &block)
    end
  end

  def test_bar
    assert_equal 42, Foo.new.public_bar
  end
end
0 голосов
/ 28 апреля 2010

Как насчет тестирования подкласса, который делает ваш закрытый (защищенный) метод доступным через метод обтекания?

class Controller

protected
  def your_private_method
    ...
  end

end


class SubclassForTest < Controller

  def testwrapper
    your_private_method
  end

end
...