我有以下控制行动和试验。我是新来的测试与早该和我 知道吗 有些领域的控制器,我可以试一步。例如,我的消息以及验证的渲染。

所以我的问题是,我会怎么正确地测试这个控制器行动在应该?

我控制器行动(名称已被改变为保护无辜):

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 => 'foo@bar.com', :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 'foo@bar.com', assigns(:owner).login
  end
  should_respond_with :success
end
有帮助吗?

解决方案

现在,它的出现,你正在测试的特定功能模型的内部控制器,即应该在一个单元的测试。

我建议重新分解你的控制器,包括所需的逻辑,用于更新的所有者的电子邮件内的所有人的模型。通过这样做,你应该能够简化控制下的一个简单的 if update; else; end 类型的声明,并极大地简化了控制测试。一旦你已经移动的逻辑进入模式,可以使用建立在轨验证。

一些其他要考虑的事项:

  • 重新定向后的后行动完成后,可防止用户从双张贴意外(大多数浏览器将抱怨,当用户试图)。
  • 移动检查@的网站,并分配给@所有人来 before_filters 如果这样做了多次内部控制器。
  • 你可以避免具有检查 if request.post? 不管是 verify 或者创建一个路线`config/路线。rb'。

参考文献:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top