【问题标题】:Are these controller specs good enough?这些控制器规格是否足够好?
【发布时间】:2011-07-06 12:55:16
【问题描述】:

我是使用 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

  def wfs widget_id
    @all_features,
    @existing_features,
    @draft_features,
    @imported_features  = WidgetFeature.find_by_widget_id_group_by_status(widget_id)
  end

我已经在对应的模型中测试了WidgetFeature.find_by_widget_id_group_by_status(widget_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

欢迎就如何改进上述规格提出意见

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rspec rspec2 functional-testing


    【解决方案1】:

    你应该模拟 WidgetFeature。这样测试会更快,因为它不会命中数据库。并检查 edit 方法是否在调用 wfs 方法,您可以使用 should_receive。

    【讨论】:

    • @leensan:我知道这对你或任何人的要求太多了。但是你能提供一个简短的 sn-p 如何做到这一点。那真的很有帮助。
    • 你可以说mock_model(Widget),而不是Factory.create(:widget)
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多