2012-02-22 12 views
3

SubmissionsControllerのspace_available_mbメソッドをスタブして、5を返すようにしたいと思います。これは機能しません。それは実際のハードディスク上の正しいスペースを返します。キュウリでメソッドをスタブする方法は?

space_available_mbがコメントアウトされている場合、予期しないエラーがスローされます。つまり、should_receiveが正しく機能します。ただし、それは5を返しませんが、実数は何らかの理由でand_returnが失敗します。

さらにデバッグすると、and_returnが実際に呼び出されますが、メソッドが実行されて実数が返された後にのみ表示されます。

Scenario: Hard Disk Space is low on new submission 
    Given I am on the new_submission page 
    And hard disk space is low 
    Then I should see "Low disk space!" 

Given /^hard disk space is low$/ do 
    SubmissionsController.should_receive(:space_available_mb).and_return(5) 
end 

class SubmissionsController < ApplicationController 
    include FileManager 

    def new 
    space = space_available_mb 
    ... 
    end 
end 

module FileManager 
    def space_available_mb 
    ... 
    end 
end 
+0

[this](https://github.com/cucumber/cucumber/tree/master/examples/rspec_doubles/features)は役に立ちますか? – farnoy

+1

モックオブジェクトの作成方法について説明している@farnoy。この場合、コントローラメソッドをスタブする必要があります。 – siamii

+0

これは通常良い考えではないことに注意してください。キュウリは、通常、完全なスタックをテストする必要があります。本質的に外部サービスをスタブしようとしているユースケースは、これが推奨される唯一の時間です。 –

答えて

4

モックフレームワークによっては、構文は異なりますが、何を達成しようとしているのは上のメソッドに任意のインスタンスあなたのコントローラのをスタブされます。 RSpecには、thisがあります。だからあなたの試みによると:

Given /^hard disk space is low$/ do 
    SubmissionsController.any_instance.should_receive(:space_available_mb).and_return(5) 
end 

あなたが他のモックフレームワークを使用する予定の場合は、RSpecの者のこのany_instanceような方法があるようにバインドされています。

+0

残念ながら、any_instanceは違いはありません。興味深いことに、このメソッドが呼び出されたと報告されています。なぜなら、コールをコメントアウトすると、MockExpectationErrorがスローされるからです。ただし、戻り値は代用されません。 (5を返さない) – siamii

+1

実際に 'any_instance'が問題の1つと判明しました。もう一つの問題は、 '私はnew_submissionページの上に来るべき'ハードディスクが低い段階 'であるということでした。 – siamii

+0

上記のソリューションと' SubmissionsController.any_instance.stub( ' :space_available_mb).and_return(5) '? – farnoy

関連する問題