rail3 / rspec / devise: проверка контроллера rspec завершится неудачно, если я не добавлю dummy = subject.current_user.inspect - PullRequest
10 голосов
/ 01 марта 2012

Я пытаюсь заставить RSpec работать для простого скаффолдингового приложения, начиная с тестов скаффолдов rspec.

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

Самое странное, хотя ... все мои спецификации терпят неудачу, ЕСЛИ Я не добавлю следующее утверждение сразу после строки it ... do:

dummy=subject.current_user.inspect

(Со строкой, как показано ниже, спецификации проходят. Без этой строки все тесты завершаются неудачно с присваиванием nil вместо ожидаемого значения. Я только случайно обнаружил, что когда я помещал некоторые операторы putчтобы проверить, правильно ли был установлен current_user.)

Итак, как он действует, так это то, что фиктивный оператор каким-то образом «заставляет» current_user быть загруженным, обновленным или распознанным.

Может кто-нибудь объяснить, чтои что я должен делать по-другому, чтобы мне не понадобилось фиктивное утверждение?

#specs/controllers/brokers_controller_spec.rb
describe BrokersController do
  login_admin

  def valid_attributes
    {:name => "Bill", :email => "rspec_broker@example.com", :company => "Example Inc", :community_id => 1}
  end

  def valid_session
    {}
  end

  describe "GET index" do
    it "assigns all brokers as @brokers" do
      dummy=subject.current_user.inspect    # ALL SPECS FAIL WITHOUT THIS LINE!
      broker = Broker.create! valid_attributes
      get :index, {}, valid_session
      assigns(:brokers).should eq([broker])
    end
  end
  describe "GET show" do
    it "assigns the requested broker as @broker" do
      dummy=subject.current_user.inspect  # ALL SPECS FAIL WITHOUT THIS LINE!
      broker = Broker.create! valid_attributes
      get :show, {:id => broker.to_param}, valid_session
      assigns(:broker).should eq(broker)
    end
  end

, и в соответствии с разработанной вики здеськак я могу войти в систему: пользователь или: admin

#spec/support/controller_macros.rb
module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      sign_in Factory.create(:admin) # Using factory girl as an example
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = Factory.create(:user)
      user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module
      sign_in user
    end
  end
end

Ответы [ 3 ]

14 голосов
/ 30 июня 2012

Какая борьба!Спасибо, Робин, я часами гуглял по этому вопросу и наконец увидел твой пост;теперь мои тесты контроллера работают:)

Чтобы добавить к вашему ответу, я выяснил, как включить сеанс devise в хеш valid_session, который позволяет тестам контроллера работать правильно, как генерируется rails.

def valid_session
  {"warden.user.user.key" => session["warden.user.user.key"]}
end
13 голосов
/ 21 марта 2012

В ваших тестах есть следующий код:

 def valid_session
    {}
 end
 ...
   get :index, {}, valid_session

Из-за этой переменной 'session' 'log_in', который вы сделали, по существу не используется во время 'get'.

Я решил это путем удаления всех аргументов "valid_session" для вызовов get, post, put, delete в спецификации этого контроллера. Пример выше становится:

get :index, {}

Я подозреваю, что есть способ добавить сеанс устройства в хеш "valid_session", но я не знаю, что это такое.

2 голосов
/ 15 июля 2012

Спасибо за это решение.

Если вы используете другую модель Devise, идентификатор сессии также изменится.

Для администратора модели используйте следующее:

def valid_session
    {'warden.user.administrator.key' => session['warden.user.administrator.key']}
end
...