рельсы render_to_string проблема

Я пытаюсь протестировать свой контроллер с помощью rspec и всегда получаю сообщение об ошибке.

users_controller.rb:

def update
    @user.update_attributes!(params[:user])

    redirect_to @user, :status => 202, :text => render_to_string(:partial => "users/show", :type => "json", :locals => {:user => @user})
    #notice, that redirect_to was reinitialized and :text is a parameter for response_body
end
_show.tokamak
user {
  id user.id
  email user.email
  username user.username
}
spec file
it "should NOT update user username" do
      username = @user.username
      put 'update', :id => @user.id, :user => {:username => username+"abc"}, :format => :json
      response.status.should be(202) 
      response.headers["Location"].length.should be > 0
      puts response.body
      @user.reload
      @user.username.should eq(username)
      end
    end

Итак, я получаю сообщение об ошибке:

Сбой / Ошибка: введите 'update',: id => @ user.id,: user => {: username => username + "abc"},: format =>: json ActionView :: Template :: Error: У вас есть nil, когда вы этого не ожидали! Вы могли ожидать экземпляр Array. Ошибка при оценке nil. [] # C: /Users/makaroni4/free_frog/ffapi/app/views/users/_show.tokamak: 1: in _app_views_users__show_tokamak___509498818 _32151168_368311673' # C:/Users/makaroni4/XXX/XXX/app/controllers/users_controller.rb:22:in update '# ./users_controller_spec.rb:34:in `block (4 уровни) в '

Так может я неправильно назвал метод render_to_string?


person makaroni4    schedule 17.05.2011    source источник


Ответы (1)


Попробовать найти?

mock_user = User.stub(:find).with(@user.id) {@user}

Честно говоря, я бы пошел еще на несколько шагов и убедился, что вы имитируете и заглушаете большую часть соответствующего поведения объекта User (или любого другого класса @user). Имейте в виду, что вы проверяете только то, что действие контроллера возвращает то, что вы ожидаете, если вы дадите ему правильный ввод, а не то, что сама модель делает правильные вещи.

Мне было очень трудно понять различия в характеристиках модели и контроллера ...

Надеюсь, это поможет ... если нет, заранее прошу прощения ...

РЕДАКТИРОВАТЬ:

Я сделаю еще один шаг и предположу, что этот тест на самом деле является модельным. Фактический тест контроллера будет примерно таким, как должен вести себя ваш тест спецификации:

it "should NOT update user with invalid input" do
  mock_user = mock_model(User, {}).as_null_object
  User.stub(:find).with("12") {mock_user}
  User.stub(:update_attributes).with({}).and_return(false)
  put 'update', :id => "12"

  # test that your output is correct, or even if the render target is what you expect.

end
person jaydel    schedule 17.05.2011
comment
Большое спасибо!!! На самом деле это моя ошибка, я не упомянул, что я создаю @user с помощью Fabricator и он отлично работает) Проблема определенно в render_to_string (тест без этого метода работает нормально). - person makaroni4; 17.05.2011