1

これを説明する方法がよくわかりません。

RSpec 2.8.1 を実行する既存の Rails 3.1.3 アプリがあり、284 個のテストのテスト スイートがあります。彼らはとても幸せに何度も何度も実行します。

今日、ユーザーが設定を更新するための新しいテストを追加しました -

require 'spec_helper'

describe UserSettingsController do

  describe 'PUT "update"' do

    let!(:user) { Fabricate :user }

    it 'updates the User with the correct attributes' do
      proxy = double('proxy')   #.as_null_object
      controller.should_receive(:current_user).any_number_of_times { proxy }

      attributes = Fabricate(:user_settings).stringify_keys
      proxy.should_receive(:update_attributes).with(attributes, :as => :updater) { true }

      login_user(user)
      put :update, :user => attributes
    end

  end

end

application_controller.rb に current_user も参照する before_filter があるため (モックで予期しないメッセージが表示される)、最初はこのテストが失敗するため、モックを null オブジェクトにすることを考えました (上記のコメントアウトされた領域を参照)。

ただし、これを行うと...テストが終了した後(ただし、次のテストに進む前に)、テストスイート全体が無限ループのようにハングします。

誰もこのようなものを見たことがありますか?.as_null_object を間違って使用していますか?

編集:いくつかのことを明確にするためにlogin_user、テストで認証するためにソーサリーが提供するヘルパーであり、:user_settingsファブリケーターはタイムゾーンを含むハッシュを作成しているだけです。

4

1 に答える 1

1

:user_settingsあなたの工場が自己言及的でない限り、私は2つのことをすることを検討したいと思います. 初め:

describe UserSettingsController do

  describe 'PUT "update"' do
    let(:proxy) { double('proxy').as_null_object }
    let(:user) { Fabricate :user }

    before(:each) do
      login_user(user)
    end

    it 'updates the User with the correct attributes' do
      controller.should_receive(:current_user).any_number_of_times { proxy }

      attributes = Fabricate(:user_settings).stringify_keys
      proxy.should_receive(:update_attributes).with(attributes, :as => :updater) { true }

      put :update, :user => attributes
    end

  end

end

これが以前のように失敗した場合、問題は魔法の内部のどこかにあることがわかります。(コンソールにサマリー文字列の出力例が表示されることはありません。) 私が#as_null_object呼び出しを続けたことに注意してください。ソーサリーは、嘲笑されたユーザーに情報を要求し、ほとんどがハッシュを埋めます。興味があればここから読み始めてください。それでも問題の特定に役立たない場合は、login_user完全に削除することを検討してください。そのようです:

describe UserSettingsController do

  describe 'PUT "update"' do
    let(:proxy) { double('proxy') }
    let(:user) { Fabricate :user }

    it 'updates the User with the correct attributes' do
      controller.should_receive(:current_user).any_number_of_times { proxy }

      attributes = Fabricate(:user_settings).stringify_keys
      proxy.should_receive(:update_attributes).with(attributes, :as => :updater) { true }

      put :update, :user => attributes
    end

  end

end

current_userコントローラーによって定義されるようにスタブアウトしています。これは、 before_filter auth フックcurrent_userproxy. すべての呼び出しで何か間抜けなことが起こっている場合は、少なくともそれらの数を削減しました。

私はまだ推測しています-私はサンプルアプリを構築していません. 幸運を。

于 2012-01-18T05:44:55.213 に答える