17

私は15 の TDD ステップに従って Rails アプリケーションガイドを作成しましたが、解決できない問題に遭遇しました。WordsController の機能テストのために、次のコードを用意しました。

class WordsControllerTest < ActionController::TestCase
  
  test "should get learn" do
    get 'learn'
    assert_response :success
  end

  test "learn passes a random word" do    
    some_word = Word.new
    Word.expects(:random).returns(some_word)
    get 'learn'
    assert_equal some_word, assigns('word')
  end
end

Word クラスには、次のコードがあります。

class Word < ActiveRecord::Base
  def self.random
    all = Word.find :all
    all[rand(all.size)]
  end
end

テストを実行すると、次のエラーが発生します (簡潔にするために短縮されています)。

1) Failure: unexpected invocation: Word(...).random() satisfied expectations:
- expected exactly once, already invoked once: Word(...).random()

テストの順序を変更して他の多くのことを変更しようとしましたが、何度も何度も同じテストの失敗を受け取り続けます - その Word.random() はすでに呼び出されています。

Rails 3.0 beta 4 と Mocha 0.9.8 を実行しています。問題の解決策を長い間懸命に探してきましたが、見つけられないようです。私は Ruby/Rails を初めて使用するので、言語とフレームワークに慣れていません。

前もって感謝します!

4

5 に答える 5

20

mocha は最後にロードする必要があります。私もこの問題にかなり苦労しました。

#Gemfile
  group :test
    gem 'mocha', '~>0.9.8', :require => false
    ...
  end

test_helper.rb
  ....
  #at the very bottom
  require 'mocha'
于 2010-12-07T09:53:11.230 に答える
7

私も同じ問題を抱えていました。モックされた機能がテストに分離されていませんでした。モカのロード順序に問題があるようです。

MochaをRails3で動作させるのにいくつか問題がありました。に関するスタックオーバーフローの投稿をいくつか見つけましたが、agoragames.comに投稿を見つけるまで、ソリューションに出くわしませんでした

基本的に、プロジェクトのGemfileでは、Mochaの要件は次のようになります。

gem 'mocha', :require => false

次に、にtest/test_helper.rb、mochaのrequire行を追加します。

...
...
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'mocha'

class ActiveSupport::TestCase
...
...

Gemfileのmochaのrequire行は、すでにmochaをgemとしてインストールする必要があることを意味していると思います。バンドラーは、それを処理しません。

于 2010-12-03T17:11:28.837 に答える
2

どのようにモカを必要としていますか? バンドラーを使用していますか?モカ分解フックが呼び出されていないように聞こえますか?

于 2010-09-27T22:21:31.773 に答える
0

また、rails31 で mocha_teardown が呼び出されていないようです。セットアップされたモックは削除されません... (この追加のハックで修正されます)

  class ActiveSupport::TestCase
    def teardown
      super
      Mocha::Mockery.instance.teardown
      Mocha::Mockery.reset_instance    
    end
  end
于 2011-09-19T01:08:40.133 に答える
0

これらのソリューションは、Ruby 2.2.2、Rails 4.2.2、mocha 1.1.0、shoulda-context 1.2.1、factory_girl_rails 4.5.0、およびいくつかのテスト関連の宝石を使用して、私にとってはうまくいきませんでした。

my の下部にあるこれらの2行移動していたのは何ですかtest_helper.rb

require 'mocha/setup'
require 'mocha/test_unit'

も外しましrequire 'test/unit'た。mocha/test_unitすでにそれを行っているようです。

于 2015-10-10T16:41:37.627 に答える