ActionDispatch::ClosedError при тестировании создания модели Rails 3.1 (RSpec/Cucumber)

Я создаю веб-приложение с Ruby on Rails 3.1 (RC1). Я использую Factory Girl, RSpec и Cucumber (вместе с Capybara) для тестирования, но неожиданно возникают ActionDispatch::ClosedErrors иногда (не каждый раз), когда я создаю новых пользователей (с помощью действия create модели User). Ниже приведено сообщение об ошибке, которое я получаю:

Cannot modify cookies because it was closed. This means it was already streamed
back to the client or converted to HTTP headers. (ActionDispatch::ClosedError)

Ошибка возникает при использовании этих способов создания пользователей:

  • Creation using Factory Girl
    • Factory.create( :user )
    • Factory.build( :user ).save
  • Basic creation
    • User.create( { ... } )
    • User.new( { ... } ).save

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

users_controller_spec.rb

требуется 'spec_helper'

def user
  @user ||= Factory.create( :user )
end

def valid_attributes
  Factory.attributes_for :user
end

describe UsersController do

  describe 'GET index' do
    it 'assigns all users as @users' do
      users = [ user ] # The call to user() raises the error here
      get :index
      assigns[ :users ].should == users
    end
  end

  describe 'GET show' do
    it 'assigns the requested user as @user' do
      get :show, id: user.id # The call to user() raises the error here
      assigns[ :user ].should == user
    end
  end

Однако ошибка не возникает в следующем блоке кода:

description 'GET edit' do it 'назначает запрошенного пользователя как @user' do get :edit, id: user.id # Это не вызывает ошибок assigns[ :user ].should == user end end

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

Буду очень признателен за любые предложения о том, что я могу делать неправильно!


person sindrenm    schedule 30.05.2011    source источник


Ответы (3)


Это связано с тем, как рельсы 3 теперь передают ответ. Они опубликовали исправление в Edge для той же проблемы во flash, но еще не в файлах cookie. На данный момент я отключил свои спецификации запроса. Я собираюсь посмотреть на проблему в эти выходные, если никто не доберется до нее раньше.

https://github.com/rails/rails/issues/1452

person Dreamr OKelly    schedule 01.06.2011
comment
Спасибо, это объясняет ошибки. Я надеюсь, что скоро исправят куки, чтобы мои спецификации работали правильно. - person sindrenm; 02.06.2011

Кто-то разместил обходной путь здесь

https://github.com/binarylogic/authlogic/issues/262#issuecomment-1804988

person Martin Vielsmaier    schedule 31.08.2011

Чтобы не переходить по ссылкам, вот моя модифицированная версия обходного пути authlogic:

class User < ActiveRecord::Base
  acts_as_authentic do |c|
    c.maintain_sessions = false if Rails.env == "test"
  end    
end

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

person JohnMetta    schedule 20.06.2012