Спецификация контроллера не входит в мой созданный на заводе пользователь - PullRequest
4 голосов
/ 04 февраля 2012

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

Я создаю своего пользователя в users.rb, используя Factory-girl, как показано ниже ...

FactoryGirl.define do
  factory :user do 
    sequence :email do |n| 
      "test#{n}@email.com"
    end
    password "password"
    password_confirmation "password"
  end
end

Затем в моем courses_controller_spec.rb Я имитирую логин, как показано ниже ..

require 'spec_helper'
describe CoursesController do
  include Devise::TestHelpers

  before(:each) do
    #@request.env["devise.mapping"] = Devise.mappings[:user]
    user = Factory.create(:user)
    user.toggle!(:admin)
    sign_in user
  end

  describe "DELETE destroy" do
    it "redirects to the courses list" do
      course = Factory.create(:course)
      delete :destroy, {:id => course.to_param}, valid_session
      response.should redirect_to(courses_url)
    end
  end

И получаю вывод ...

Failure/Error: response.should redirect_to(courses_url)
Expected response to be a redirect to <http://test.host/courses> but was a redirect to <http://test.host/users/sign_in>

Обратите внимание, что я также использовал следующее в моем spec_helper.rb

config.include Devise::TestHelpers, :type => :controller

И я пробовал это в соответствии с https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3-%28and-rspec%29

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

fill_in "Email", :with => user.email
fill_in "Password", :with => user.password
click_button "Sign in"

Любая помощь здесь будет высоко ценится.

1 Ответ

6 голосов
/ 05 февраля 2012

Я только что понял это сам. Удалите valid_session из вашего вызова удаления. Кажется, это перезаписывает сеанс, определенный с помощью помощников по тестированию устройства.

Все остальное кажется правильным. Сохраните весь код установки devise и просто измените строку удаления в вашей спецификации на:

delete :destroy, {:id => course.to_param}

Я также сохранил следующую строку в моем блоке before( :each ), который вы закомментировали. Не уверен, что он делает еще:

@request.env["devise.mapping"] = Devise.mappings[:user]
...