0

Rails 3.2 アプリをテストしていますが、コントローラーをテストしようとしたときにエラーが発生しました。

これは私のコントローラーです

class WidgetsController < ApplicationController
  #skip_before_filter :authenticate, :only => [:new, :create]
  before_filter :authenticate, :except=>[:disabled]

  def index
    @widgets = current_user.widgets.all
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @widgets }
    end
  end

  def new
    @widget = Widget.new
  end

  def create
    @widget = Widget.new(params[:widget])
    @widget.user_id = current_user.id
    @widget.score = 0
    @widget.total_score = 0
    @widget.click_number = 0
    @widget.average = 0
    respond_to do |format|
      if @widget.save
        format.html { redirect_to edit_widget_path(@widget), notice: 'Widget was successfully created.' }
        format.json { render json: @widget, status: :created, location: @widget }
      else
        format.html { render action: "new" }
        format.json { render json: @widget.errors, status: :unprocessable_entity }
        raise 'there is an error when creation'
      end
    end
  end

  def show
    @widget = Widget.find_by_uuid(params[:uuid])
  end

  def edit
    @widget = Widget.find_by_uuid(params[:uuid])
  end

  def update
    @widget = Widget.find_by_uuid(params[:uuid])
    respond_to do |format|
      if @widget.update_attributes(params[:widget])
        format.html { redirect_to edit_widget_path(@widget), notice: 'Widget was successfully updated.' }
        format.json { render json: @widget, status: :created, location: @widget }
      else
        format.html { render action: "edit" }
        format.json { render json: @widget.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @widget = Widget.find_by_uuid(params[:uuid]).destroy
    redirect_to widgets_path
  end

  #generate widget
  def generate
    respond_to do |format|
      format.js {}
    end
  rescue
    #TODO add widget not found page
    render :template => 'application/widget_not_found', :status => :not_found
  end



  protected

  def authenticate
    unless current_user
      redirect_to root_url
    end
  end

end

これは私のコントローラーの仕様です

require 'spec_helper'

describe WidgetsController do
  login_admin

  describe "User" do
    it "should have a current_user" do
      subject.current_user.should_not be_nil
    end
  end

  def mock_widget(stubs={})
    @mock_widget ||= mock_model(Widget, stubs).as_null_object
  end

  describe "GET index" do
    it "assigns all widgets as @widgets" do
      Widget.stub(:all) { [mock_widget] }
      get :index
      assigns(:widgets).should eq([mock_widget])
    end
  end

end

インデックスページでデータを取得できることを確認したいだけです。ただし、実行時にコマンドラインでこのエラーが表示されました$rspec spec/controllers/widgets_controller_spec.rb

.F

Failures:

  1) WidgetsController GET index assigns all widgets as @widgets
     Failure/Error: assigns(:widgets).should eq([mock_widget])

       expected: [#<Widget:0x3ffb0c3c9d70 @name="Widget_1001">]
            got: []

       (compared using ==)

       Diff:
       @@ -1,2 +1,2 @@
       -[#<Widget:0x3ffb0c3c9d70 @name="Widget_1001">]
       +[]
     # ./spec/controllers/widgets_controller_spec.rb:20:in `block (3 levels) in <top (required)>'

Finished in 0.11937 seconds
2 examples, 1 failure

Failed examples:

rspec ./spec/controllers/widgets_controller_spec.rb:17 # WidgetsController GET index assigns all widgets as @widgets

このチュートリアルhttp://www.codethinked.com/rails-3-baby-steps-part-4を実行しましたが、何の問題もありませんでした。どうすれば直せますか?このエラーはどういう意味ですか?

4

1 に答える 1

1

コントローラーで current_user によって返されるウィジェットのセットをスコープすることに関係があると思います。コントローラーではall、ウィジェット オブジェクトのコレクション (Widget クラスのインスタンス) でメソッドを呼び出しており、テストallでは、Widget クラスのメソッドをスタブ化しています。この理論をテストするには、コントローラ メソッドを単純に呼び出すように変更しますWidget.all。それがあなたのやりたいことではないことは知っていますが、これが問題であることを確認します。

于 2012-05-25T15:42:27.803 に答える