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

Я создаю веб-приложение с Ruby on Rails 3.1 (RC1). Я использую Factory Girl , RSpec и Огурец Капибара ) для тестирования, но я испытываю неожиданные повышения ActionDispatch::ClosedError с иногда (не каждый раз), когда я создаю новых пользователей (с помощью действия 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)

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

  • Создание с использованием Factory Girl
    • Factory.create( :user )
    • Factory.build( :user ).save
  • Основное творение
    • 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

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

описать "ПОЛУЧИТЬ редактировать" сделать он 'назначает запрошенного пользователя как @user' do get: edit, id: user.id # Это не вызывает ошибки назначает [: user] .should == пользователь конец конец

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

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

Ответы [ 3 ]

5 голосов
/ 01 сентября 2011

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

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

2 голосов
/ 02 июня 2011

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

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

1 голос
/ 20 июня 2012

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

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

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

...