2009-01-21 101 views
1

我有以下控制器操作和測試。我是新來的測試與Shoulda和我知道有我的控制器的領域,我可以進一步測試。例如,我的Flash消息以及驗證渲染。如何使用Shoulda正確測試此控制器操作?

所以我的問題是,我將如何在Shoulda中正確地測試此控制器操作?

我的控制器動作(名稱已更改爲保護無辜者):

def my_action 
    return redirect_to(root_url) if @site.nil? 
    @owner = current_site.owner 
    if request.post? 
    if params[:password].blank? || params[:email].blank? 
     flash[:error] = "You must fill in both the e-mail and password fields" 
     render :action => "my_action" 
    else 
     if @owner.authenticated?(params[:password]) 
     @owner.login = params[:email] 
     @owner.save! 
     @owner.do_some_method 
     flash[:success] = "Success." 
     render :action => "my_action" 
     else 
     flash[:error] = "Incorrect password" 
     render :action => "my_action" 
     end 
    end  
    end 
end 

我的測試:

context "on POST to :my_action" do 
    setup do 
    Owner.any_instance().expects(:do_some_method) 
    post :my_action, :email => '[email protected]', :password => 'test' 
    end 
    should_assign_to :owner 
    should "Change name and verify password and resend activation key" do 
    assert_equal true, assigns(:owner).authenticated?('test') 
    assert_equal '[email protected]', assigns(:owner).login 
    end 
    should_respond_with :success 
end 

回答

2

眼下,似乎你正在測試的具體功能模型在您的控制器內部,應該在單元測試中。

我建議重新考慮你的控制器,以包含更新所有者模型中所有者電子郵件所需的邏輯。通過這樣做,您應該能夠將控制器簡化爲簡單的if update; else; end類型語句,並極大地簡化了控制器測試。一旦將邏輯移入模型中,就可以使用內置的Rails驗證。

幾個其他的事情要考慮:你的POST操作完成後重定向

  • ,防止用戶雙擊張貼偶然(當用戶試圖就大多數瀏覽器會抱怨)。
  • 如果在控制器內多次執行此操作,則將@site的檢查以及分配給@owner移動到before_filters
  • 您可以避免使用verify或在config/routes.rb中創建路由來檢查if request.post?

參考

相關問題