У меня есть контроллер:
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
Как протестировать частный метод current_account
с помощью rspec?
PS Я использую Rspec2 и Ruby on Rails 3
ruby-on-rails
rspec
Петрушка
источник
источник
Ответы:
Используйте #instance_eval
источник
Я использую метод отправки. Например:
Потому что send может вызывать частные методы
источник
.send
?Где используется метод current_account? Какой цели это служит?
Как правило, вы не тестируете частные методы, а скорее тестируете методы, которые вызывают частный метод.
источник
Вы не должны тестировать свои частные методы напрямую, их можно и нужно тестировать косвенно, используя код из общедоступных методов.
Это позволяет вам в дальнейшем изменять внутреннюю структуру вашего кода без изменения ваших тестов.
источник
Вы можете сделать свои частные или защищенные методы общедоступными:
Просто поместите этот код в свой тестовый класс, заменив свое имя класса. Включите пространство имен, если применимо.
источник
источник
Частные методы модульного тестирования кажутся слишком далекими от контекста с поведением приложения.
Вы сначала пишете код вызова? Этот код не вызывается в вашем примере.
Поведение таково: вы хотите, чтобы объект был загружен из другого объекта.
Почему вы хотите написать тест вне контекста поведения, которое вы должны пытаться описать?
Этот код используется во многих местах? Нужен более общий подход?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller
источник
Используйте гем rspec-context-private, чтобы временно сделать частные методы общедоступными в контексте.
Он работает путем добавления общего контекста в ваш проект.
Затем, если вы передадите
:private
вdescribe
блок как метаданные , частные методы будут общедоступными в этом контексте.источник
Если вам нужно протестировать частную функцию, создайте общедоступный метод, который вызывает частный.
источник
Я знаю, что это своего рода хакерство, но оно работает, если вы хотите, чтобы методы проверялись rspec, но не отображались в продукте.
Теперь, когда вы можете запустить, ваша спецификация выглядит так:
источник