Тест Rspec не пройдет с помощью assigns () - PullRequest
3 голосов
/ 10 ноября 2011

Вот мой текущий файл users_controller_spec.rb

require 'spec_helper'

describe UsersController do
  render_views
  .
  .
  .
  describe "success" do

   before(:each) do
    @attr = { :name => "New User", :email => "user@example.com",
              :password => "foobar", :password_confirmation => "foobar" }
  end

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

  it "should redirect to the user show page" do
    post :create, :user => @attr
    response.should redirect_to(user_path(assigns(:user)))
   end
  end
 end
end

Когда я запускаю это, я получаю следующее:

 Failures:

1) UsersController POST 'create' success should redirect to the user show page
 Failure/Error: response.should redirect_to(user_path(user))
 ActionController::RoutingError:
   No route matches {:action=>"show", :controller=>"users"}
 # ./spec/controllers/users_controller_spec.rb:95:in `block (4 levels) in <top (required)>'

Что заставляет меня верить, что: пользователь не являетсяактуальный объект.Как я могу проверить это и как я могу изменить: пользователя на объект, который понимает user_path.

Заранее благодарен за любую помощь.

ОБНОВЛЕНО:

def create
  @title = "Sign up"
  @user = User.new(params[:user])
  if @user.save
    redirect_to @user, :notice => "Signed Up!"
  else
    @title = "Sign up"
    render "new"
  end
end

Когда я запускаю следующее:

it "should redirect to the user show page" do
  post :create, :user => @attr
  user = assigns(:user)
  user.should_not be_blank
  puts "user errors are: #{user.errors.full_messages.inspect}" unless user.is_valid?
  user.should be_valid
  response.should redirect_to(user_path(user))
end

Я получаю:

1) UsersController POST 'create' success should redirect to the user show page
     Failure/Error: user.should_not be_blank
       expected blank? to return false, got true
     # ./spec/controllers/users_controller_spec.rb:94:in `block (4 levels) in <top (required)>'

Ответы [ 3 ]

4 голосов
/ 11 ноября 2011

Попробуйте использовать assigns с скобками вместо скобок.

assigns[:user]

( RSpec docs )


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

Один шаблон, который я всегда использую при тестировании действий контроллера, состоит в том, чтобы убедиться, что переменная, требуемая ассоциированным представлением (ями), назначена.Например,

it "should assign an @user variable" do
  post :create, :user => @attr
  assigns[:user].should_not be_nil
  assigns[:user].should be_kind_of(User)
end
2 голосов
/ 11 ноября 2011

В вашем тесте:

 it "should redirect to the user show page" do
    @user = Factory(:user)
    post :create, :user => @attr
    user = assigns(:user)
    response.should redirect_to(user_path(@user))
  end

Ваш @attr хеш отличается от @user. Вы создаете пользователя с атрибутами @attr и утверждаете, что он должен перенаправить на @user show (который отличается от созданного). Изменить на:

 it "should redirect to the user show page" do
    post :create, :user => @attr
    user = assigns(:user)
    response.should redirect_to(user_path(user))
  end
2 голосов
/ 11 ноября 2011

У вас есть опечатка

response.should redirect_to(user_path(:user))

должно быть

response.should redirect_to(user_path(user))

Редактировать: Попробуйте проверить, что пользователь действителен с:

it "should redirect to the user show page" do
  post :create, :user => @attr
  user = assigns(:user)
  user.should_not be_blank
  puts "user errors are: #{user.errors.full_messages.inspect}" unless user.is_valid?
  user.should be_valid
  response.should redirect_to(user_path(user))
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...