неопределенный метод `stringify_keys 'при создании записи в Rspec - PullRequest
2 голосов
/ 23 октября 2011

В контроллере для создания используется переменная сеанса. Как установить переменную сеанса для теста rspec?

Вот метод создания в контроллере с сессией [eng_dh]:

  def create
    if session[:eng_dh] 

      @category = Category.new(params[:category], :as => :roles_new)    

      if @category.save

        redirect_to categories_path, :notice => 'Category was successfully created.'         
      else
        render :action => "new" 
      end
    else
      redirect_to categories_path, :notice =>"NO access to create category!"
    end
  end 

Вот код ошибки rspec:

require 'spec_helper'

describe CategoriesController do
  before(:each) do
    #the following recognizes that there is a before filter without execution of it.
    controller.should_receive(:require_signin)
    controller.should_receive(:require_employee)
  end

  render_views

  describe "Post 'create'" do
    describe "success" do
      before(:each) do
        @category = Factory(:category)
        session[:eng_dh] = true  #THIS LINE CAUSED ERROR ( undefined method `stringify_keys' for "1":String) IN RSPEC TEST!!!
      end

      it "should create a category" do
        lambda do
          post :create, :category => @category
        end.should change(Category, :count).by(1)
      end

      it "should redirect to the category index page" do
        post :create, :category => @category
        response.should redirect_to(categories_path)
      end
    end

  end
end

Какие-нибудь решения? Спасибо.

1 Ответ

3 голосов
/ 23 октября 2011

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

undefined method 'stringify_keys' - это , а не из-за того, что вы задали переменную сеанса, скорее, это конструкция параметров POST из вашего объекта @category. Объект @category уже был сохранен; post ожидает хеш.

Правильная отправка параметров сообщения исправит это:

@category = Factory.attributes_for(:category)

Ваш тест начал давать сбой, когда вы добавили строку сеанса, потому что ваш контроллер будет пытаться сохранить только когда этот сеанс var установлен. Без сеанса var create ничего не делает, но ваша строка Factory уже сохранила строку. Это ложный «пас».

...