2011-10-03 49 views
3

當我繼續學習使用RSpec 2和Rails 3.1的TDD時,我似乎無法找到解決此問題的方法。帶RSpec和Rails的TDD:測試控制器沒有視圖的動作

我有一個用戶控制器與新的和創建操作。在我的UsersController天賦,我有

users_controller_spec.rb

describe "POST 'create'" do 
    before(:each) do 
    @attr = Factory.attributes_for(:user) 
    end 

    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 
end 

,並在我的UsersController,

users_controller.rb

def create 
    @user = User.new(params[:user]) 
end 

此規範與

失敗
1) UsersController POST 'create' should assign an @user variable 
    Failure/Error: post :create, :user => @attr 
    ActionView::MissingTemplate: 

我可以繼續實現應用程序代碼以通過此測試,但我覺得此測試應該按原樣傳遞。

有什麼建議嗎?

回答

3

您的create方法需要做些什麼。呈現模板或重定向。既然你沒有告訴它重定向它,假設你想要它來呈現一個模板,但是當它找不到create.html.erb文件時,它會引發錯誤。

你最好的選擇是做任何這樣的:

def create 
    @user = User.new(params[:user]) 
    redirect_to root_url 
end 

或本:

def create 
    @user = User.new(params[:user]) 
    render :nothing => true 
end 
+0

我見,我認爲測試會(並且應該)通過,因爲它確實分配了一個@user變量。換句話說,應用程序代碼正在做我正在測試的內容。看起來我需要實現比測試需要傳遞更多的應用程序代碼,因爲我還沒有測試渲染模板或用戶重定向到的位置。 – Feech

+1

沒錯。在測試中有錯誤和失敗。你的測試沒有遇到失敗(如果@user是'nil'或者不是'User'),那麼測試就會失敗。失敗或錯誤被認爲是不成功的測試。 – aNoble

+0

感謝您的幫助aNoble。我想我會保持我的控制器測試模式,首先測試正確的渲染/重定向,然後繼續發生其他事情。 – Feech

-1

我遇到這家最近我自己。似乎有一種可能性是在你的測試中挽救錯誤。

it "should assign an @user variable" do 
    begin 
    post :create, :user => @attr 
    rescue ActionView::MissingTemplate 
    # This is okay because(/as long as) we test the render/redirect 
    # in a separate spec where we don't rescue this exception. 
    end 
    assigns[:user].should_not be_nil 
    assigns[:user].should be_kind_of(User) 
end 

我不知道這個解決方案是如何「正確」的。另一方面,它肯定強調「一次測試一件事」的心態,另一方面,它看起來有點醜陋。

編輯

我想你可以在你的天賦幫助做一些漂亮的包裝,像

def post?(action, params = {}) 
    post action, params 
rescue ActionView::MissingTemplate 
end 
+0

是的,RSpec控制器測試跟隨呈現/重定向併產生錯誤沒有任何意義。 – Feech

+0

異常處理應該是例外 –

2

要測試渲染什麼,你會想:

expect(response).to render_template(nil) 
相關問題