2009-01-21 102 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?

参考

相关问题