2012-08-03 38 views
1

我測試我的應用程序以創建一個新的用戶汽車,稍後用戶創建新汽車應用程序必須重定向到user_car_path(我發佈我的路線) :lambda do count應該已經被改變了1,但被改變了0

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 

所以我測試我的應用程序與此rspec的:

describe "POST 'create' car" do 

describe "car created success" do 
    before(:each) do 
      @user = User.create!(:email => "[email protected]", :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 cars page" do 
    post :create, :cars => @car, :user_id => @user.id 
    response.should redirect_to user_car_path(@user, @car) 
    end 
end 
end 

,但我得到了2個錯誤

Failures: 

1) CarsController POST 'create' car car created success should create a car 
Failure/Error: lambda do 
    count should have been changed by 1, but was changed by 0 
# ./spec/controllers/car_controller_spec.rb:20 

2) CarsController POST 'create' car car created success should redirect to the user cars page 
Failure/Error: response.should redirect_to user_car_path(@user, @car) 
    Expected response to be a redirect to <http://test.host/users/115/cars/40> but was a redirect to <http://test.host/users/115/cars/new>. 
# ./spec/controllers/car_controller_spec.rb:27 

,但我的應用程序正常工作;這裏是我的CarController

class CarsController < ApplicationController 
.... 

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 
def show 
    @user = User.find(params[:user_id])  
    @car = @user.cars.find(params[:id]) 
end 

.... 
+0

你已經創建了車(它保存到數據庫)在你之前的步驟中,所以我猜它不會再被創建。嘗試使用'@car = Car.new(...)'而不是'@car = Car.create!(...)'看看是否有幫助。 – Frost 2012-08-03 15:30:35

+0

謝謝你的回答,你能更清楚地解釋我嗎?我在哪裏創造了汽車?我開始使用rspec – Asantoya17 2012-08-03 15:38:03

+0

@ Asantoya17在自己的代碼中查看'@car = Car.create!',並閱讀rails文檔,瞭解爲什麼'create!'與'new'不同。這不是一個rspec的事情。 – radixhound 2012-08-03 15:44:47

回答

4

您正在數據庫中創建汽車,而不是在before(:each)中創建汽車對象。你也通過參數:cars而不是:car。最後,我還親自使用let。嘗試這個。

describe "POST 'create' car" do 

    let(:user) { User.create!(:email => "[email protected]", :password => "foobar", :password_confirmation => "foobar") } 
    let(:car) { Car.new(:brand => "example", :color => "foobar", :model => "foobar", :year =>"2012")} 

    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 cars page" do 
    post :create, :cars => car, :user_id => user.id 
    # note: car doesn't have an ID, you have to fetch it from the db to get an id 
    response.should redirect_to user_car_path(user.id, user.cars.last.id) 
    end 
end 

最後一點,你會想看看Factory Girl

然後,你可以這樣做,而不是:

let(:user){ FactoryGirl.create(:user) } 
let(:car) { FactoryGirl.build(:car) } # note: BUILD not CREATE 
+0

謝謝你的回答,但仍然沒有任何結果 – Asantoya17 2012-08-03 16:01:57

+0

@Asantoya17什麼是'沒有'意思?當然,它不會給你完全相同的錯誤。 – radixhound 2012-08-03 16:20:39

+0

它不顯示相同的錯誤,現在出現ActionController :: RoutingError :: action =>「show」,:controller =>「cars」 – Asantoya17 2012-08-03 16:23:14

0

我想你想以下(:車=>:汽車和使用PARAMS這將使控制器中的汽車產生有效的我感到困惑,爲什麼要創建在規範汽車。因爲這似乎是汽車創作的測試)

it "should create a car" do 
    lambda do 
     post :create, :car => {:brand => "example", :color => "foobar", :model => "foobar", :year =>"2012"}, :user_id => @user.id 
    end.should change(Car, :count).by(1) 
    end 

    it "should redirect to the user cars page" do 
    post :create, :car => {:brand => "example", :color => "foobar", :model => "foobar", :year =>"2012"}, :user_id => @user.id 
    response.should redirect_to user_car_path(@user, @car) 
    end 
+0

真的我在學習rspec也許這就是爲什麼我可以有錯誤 – Asantoya17 2012-08-03 15:35:18

0

我認爲這是因爲您的驗證失敗。要知道,如果它不能做到這一點,之前保存在你的控制器:

puts @car.valid? 

如果是假的,你的測試將失敗,這是正常的。要設置爲true,你可以這樣做:

before(:each) do 
    ... 
    Car.any_instance.stub(:valid?).and_return(true) 
end 

您還可以使用存根和嘲笑返回實例爲User.findCar.build。請參閱文檔:https://www.relishapp.com/rspec/rspec-mocks/v/2-6/docs/method-stubs

+0

好的我解決了第一個錯誤,但仍然出現第二個錯誤「預期的響應是重定向到,但重定向到。「 – Asantoya17 2012-08-03 15:43:50

+0

嘗試在測試中刪除汽車的's'。嘗試在你的控制器中添加'puts @ car'和'puts @ user'來檢查它們是否不爲零。您也可以在控制器中進入調試模式(例如撬)。 – Dougui 2012-08-03 16:08:52

+0

錯誤已更改ActionController :: RoutingError :: action =>「show」,:controller =>「cars」 – Asantoya17 2012-08-03 16:17:37

相關問題