Ruby on rails 这些控制器规格足够好吗?

Ruby on rails 这些控制器规格足够好吗?,ruby-on-rails,ruby-on-rails-3,rspec,rspec2,functional-testing,Ruby On Rails,Ruby On Rails 3,Rspec,Rspec2,Functional Testing,我不熟悉用RSpec测试控制器。在我的控制器中,我有以下方法: def edit @widget = Widget.find(params[:id]) if @widget.present? @all_widgets = Widget.where(:id != @widget.id).select("id, title") wfs @widget.id else redirect_to widgets_url end e

我不熟悉用RSpec测试控制器。在我的控制器中,我有以下方法:

  def edit
    @widget = Widget.find(params[:id])
    if @widget.present?
      @all_widgets = Widget.where(:id != @widget.id).select("id, title")
      wfs @widget.id
    else
      redirect_to widgets_url
    end
  end

我已经测试了方法
WidgetFeature.find\u by\u widget\u id\u group\u by\u status(widget\u id)
在相应的模型中

现在,我不知道如何测试
edit
方法以及测试什么。我知道所有关于存根,模拟和双。我正在遵循Rails测试处方RSpec手册。 因此,我熟悉术语和基础知识,但我不知道何时模拟或创建数据工厂

另外,如何测试edit方法是否实际调用了wfs方法

更新:
这些是我编写的一些规范,它们提供了100%的覆盖率(由SimpleCov测试)。这是测试上述方法的最佳方法吗

  context " When #edit is called, it" do
    it "assigns @all_widgets & other variables if widget for given widget_id is present" do
      widget = Factory.create(:widget)
      get :edit, :id => widget.id
      assigns.each {|a| a.should be_kind_of(Array)}
      response.should be_success
      response.should render_template("edit")
    end
    it "redirects_to widgets_url if widget for given widget_id is not present" do
      widget = Widget.stub!(:find).with(12)
      get :edit, :id => 12
      response.should redirect_to(widgets_url)
      response.should be_redirect
    end
  end

欢迎对如何改进上述规范发表意见

您应该使用WidgetFeature。这样,测试将更快,因为它不会达到DB。要检查edit方法是否正在调用wfs方法,您可以使用should\u receive。

@leensan:我知道它对您或任何人要求太高了。但是,您能否提供一个简短的片段来说明如何做到这一点。这将非常有用。您可以说
mock\u model(widget)
,而不是
Factory.create(:widget)
  context " When #edit is called, it" do
    it "assigns @all_widgets & other variables if widget for given widget_id is present" do
      widget = Factory.create(:widget)
      get :edit, :id => widget.id
      assigns.each {|a| a.should be_kind_of(Array)}
      response.should be_success
      response.should render_template("edit")
    end
    it "redirects_to widgets_url if widget for given widget_id is not present" do
      widget = Widget.stub!(:find).with(12)
      get :edit, :id => 12
      response.should redirect_to(widgets_url)
      response.should be_redirect
    end
  end