0

Ruby on Rails のプロジェクトに取り組んでいます。gem 内のモジュールを使用するコントローラー アクションがあります。この gem はまだ完成しておらず、ファイル システムにもありません。

コントローラーをテストするために、モジュールをモックするように言われました。実際の宝石なしでこれをテストする方法はありますか? 「require」呼び出しを嘲笑することはできますか? 現在、モッキングとスタビングに Mocha を使用しています。

Python でインポートをモックする方法があります。ruby での require のモックにも同様の答えがあるかもしれません。 インポートをモックする方法

または、これを処理するための最良の方法を教えてください。

更新:モックするように言われた人は、スタブ ファイルを追加することを提案しましたが、それにはコントローラーにテスト コードを追加する必要があり、私はそうしたくありません。

更新 2: コントローラーは、モジュールで宣言されたメソッドを使用します。

4

2 に答える 2

0

メソッド呼び出しをモックするテストを作成している場合、それらは失敗します。例えば、

controller.should_receive(:method_in_non_existent_module).with(args) #=> errors

正しい Red->Green TDD シナリオでは、次のステップで gem/file を要求し、モジュールをインクルードし、コントローラーにメソッド呼び出しを追加してテストに合格するため、これで問題ありません。ただし、ファイルがまだ存在しないためにファイルを要求できないため、テストに合格することはできません。

テストではなく、実際のコードでメソッドをモックするように依頼した開発者である可能性があります。たとえば、彼は最近の技術会議から最も人気のあるドングル ジョークを取得するメソッドを持つ gem 'dongle-jokes' を書いています。彼は、gem がコントローラーとビューを完了するためのブロックになることを望んでいないため、ダミーの応答を吐き出すダミー インターフェイスを使用するように求めています。

  1. 失敗するテストを書く
  2. ファイルを追加するlib/dongle-jokes.rb
  3. そのファイルに以下を追加します。

    module DongleJokes
      def joke
        "Dongle jokes aren't funny!"
      end
    end
    
  4. ファイルを要求してモジュールをインクルードし、コントローラーでメソッドを使用します。

これでテストに合格するはずです。lib/dongle-jokes.rb実際の gem を使い始めると削除できます。

于 2013-04-05T19:40:37.580 に答える
0

Rails で作業している場合は、require をコントローラに追加する必要はありません。gemfile に gem を追加すると、Rails の起動時に自動的に必要になります。

あなたの同僚がおそらく意味していたのは、モジュール自体をスタブ化する必要があるということでした。テストに rspec を使用していますか? もしそうなら、あなたは使用できるはずですstub_const。モジュールが と呼ばれているとしましょうPayments。その後、次のようなテスト コードを記述できます。

before do
  stub_const("Payments", stub)
  Payments.stub(process: "payments successful")
end
于 2013-04-05T19:43:49.593 に答える