0

私はrspecでテストしていますが、私の絶え間ない問​​題はルートにあります。これは私のrspecです

describe "POST 'create'" do

    describe "success" do

        before(:each) do
            @user = User.create!(:email => "foo@example.com", :password => "foobar", :password_confirmation => "foobar" )
            @car = Car.create!(:brand => "example", :color => "foobar", :model => "foobar", :year =>"2012")
        end

        it "should create a car" do
            lambda do
            post :create, :cars => @car, :user_id => @user.id
            end.should change(Car, :count).by(1)
        end

        it "should redirect to the user welcome page" do
            post :create, :cars => @car, :user_id => @user.id
            response.should redirect_to user_car_path
        end
    end
end

私のroutes.rb ...

Estaciones::Application.routes.draw do
root :to => "static_pages#home"
match '/contact', :to=>'static_pages#contact'
match '/about', :to=>'static_pages#about'
devise_for :users
resources :gas_stations
resources :users do
  resources :cars do
    resources :tanking_logs
  end
end
....

アップデート

テストを実行すると、次のエラーが発生しました。

1) CarsController POST 'create' success should create a car
 Failure/Error: post :create, :cars => @car, :user => @user
 ActionController::RoutingError:
   No route matches {:cars=>"12", :user=>"74", :controller=>"cars", :action=>"create"}
 # ./spec/controllers/car_controller_spec.rb:22:in `block (5 levels) in <top (required)>'
 # ./spec/controllers/car_controller_spec.rb:21:in `block (4 levels) in <top (required)>'

2) CarsController POST 'create' success should redirect to the user welcome page
 Failure/Error: post :create, :cars => @car, :user => @user
 ActionController::RoutingError:
   No route matches {:cars=>"13", :user=>"75", :controller=>"cars", :action=>"create"}
 # ./spec/controllers/car_controller_spec.rb:27:in `block (4 levels) in <top (required)>'

ここに私のCarsControllerがあります

class CarsController < ApplicationController
def new
  @user = User.find(params[:user_id])
  @car = @user.cars.build
end

def create
  @user = User.find(params[:user_id])
  @car = @user.cars.build(params[:car])
  if @car.save
    redirect_to user_car_path(@user, @car), :flash => { :notice => "  car created!" }
  else
    redirect_to new_user_car_path ,:flash => { :notice => " sorry try again :(" }
  end
end

....

あなたがくれた解決策で編集しましたが、まだ何もありません

ここに私のレーキルートがあります

user_cars GET    /users/:user_id/cars(.:format)                               cars#index
                      POST   /users/:user_id/cars(.:format)                               cars#create
         new_user_car GET    /users/:user_id/cars/new(.:format)                           cars#new
        edit_user_car GET    /users/:user_id/cars/:id/edit(.:format)                      cars#edit
             user_car GET    /users/:user_id/cars/:id(.:format)                           cars#show
                      PUT    /users/:user_id/cars/:id(.:format)                           cars#update
                      DELETE /users/:user_id/cars/:id(.:format)                           cars#destroy
4

1 に答える 1

0

:carsリソース内にリソースがネストされているようです:users

resources :users do
  resources :cars do
...

このようにルートを構成する場合、http アクションを呼び出すときにユーザーも指定する必要があります。これはうまくいきません:

post :create, :car => @car

が欠落しているため:user_id、コントローラーでアクセスします。

@user = User.find(params[:user_id])

これを解決するには、a を渡して:user_idからモックまたはスタブを渡してUser、ユーザーまたはモック ユーザーを返します。

アップデート:

モックと実際のレコードを混在させることは一般的には良い習慣ではないため、モックなしでそれを行う方法を次に示します。

before(:each) do
  @user = User.create(...)
  @car = {:brand => "example", :color => "foobar", :model => "foobar", :year =>"2012" }
end

it "should create a car" do
  lambda do
    post :create, :car => @car, :user_id => @user.id
  end.should change(Car, :count).by(1)
end

it "should redirect to the user welcome page" do
  post :create, :car => @car, :user_id => @user.id
  response.should redirect_to user_car_path
end

ユーザーを作成するために必要な最小限の属性を に挿入しますUser.create(...)。そうすべきだと思います。

モックでこれを行いたい場合 (一般的には、コントローラーとモデルの仕様を分離しておくためのより良い方法です)、これを行う方法についての良い出発点は次のとおりです。

于 2012-08-02T21:42:53.543 に答える