RSpec и защищенные методы, спецификация контроллера для current_user - PullRequest
13 голосов
/ 04 марта 2011

Я мог бы пойти по этому неправильному пути. Сначала я делаю спецификацию, BDD / TDD и столкнулся с проблемой.

У меня есть этот application_controller_spec.rb

require "spec_helper"

describe ApplicationController do
  describe "current_user" do
    it "should return nil if no one is logged in" do
      subject.current_user.should be_nil
    end
    it "should return currently logged in user" do
      hash = {user_id: "my_id"}
      subject.should_receive(:session).and_return hash
      subject.current_user.should == "my_id"
    end
  end
end

, который отлично работает без ключевое слово protected.

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method :current_user

  protected
  def current_user
    session[:user_id]
  end
end

с с включенным protected, я получаю эту ошибку msg

NoMethodError: protected method `current_user' called for #<ApplicationController:0x2a90888>

Я должен быть в состоянии проверить, используя helper_method ... Есть предложения?

Ответы [ 2 ]

13 голосов
/ 05 марта 2011

helper_method делает метод доступным в представлениях, а не в контроллере, в соответствии с документами .

Если вам действительно нужен доступ к методу из спецификаций контроллера, вы можете использовать send:

subject.send(:current_user).should be_nil

Но вы, возможно, захотите подумать, имеет ли смысл тестирование закрытых методов или было бы лучше протестировать с использованием спецификаций представления. Или нужно ли защищать метод в первую очередь. Также было бы полезно посмотреть, как Devise и Authlogic проводят тестирование для своих current_user методов.

2 голосов
/ 20 июля 2017

Хотя прошло уже довольно много времени с момента первоначального вопроса, возможно, кто-то посчитает это полезным.

Вы можете создать анонимный подкласс ApplicationController и предоставить внутри него защищенные методы. Нет необходимости в методе send().

Вот как это сделать:

describe ApplicationController, type: :controller do
  controller do
    def current_user
      super
    end
  end

  ...

  it 'should return nil if no one is logged in' do
    expect(controller.current_user).to be_nil # (or whatever)
  end

end

Источник это ТАК ответ.

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