23

私の質問は非常に簡単ですが、ここで答えを見つけることができませんでした:

メソッドをスタブしてパラメーター自体を返すにはどうすればよいですか (たとえば、配列操作を行うメソッドで)。

このようなもの:

 interface.stub!(:get_trace).with(<whatever_here>).and_return(<whatever_here>)
4

3 に答える 3

30

注:スタブメソッドは廃止されました。これを行う最新の方法については、この回答を参照してください。


stub!ブロックを受け入れることができます。ブロックはパラメーターを受け取ります。ブロックの戻り値はスタブの戻り値です。

class Interface
end

describe Interface do
  it "should have a stub that returns its argument" do
    interface = Interface.new
    interface.stub!(:get_trace) do |arg|
      arg
    end
    interface.get_trace(123).should eql 123
  end
end
于 2011-05-09T14:55:57.357 に答える
21

stub メソッドは、expect を支持して廃止されました。

expect(object).to receive(:get_trace).with(anything) do |value| 
  value
end

https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation

于 2015-02-26T18:31:26.890 に答える
5

(モック)allowの代わりに (スタブ)を使用できます。expect

allow(object).to receive(:my_method_name) { |param1, param2| param1 }

名前付きパラメータを使用:

allow(object).to receive(:my_method_name) { |params| params[:my_named_param] }

以下は実際の例です。

S3StorageServiceメソッドを使用してファイルを S3 にアップロードするがあるとしますupload_file。このメソッドは、アップロードされたファイルへの S3 ダイレクト URL を返します。

def self.upload_file(file_type:, pathname:, metadata: {}) …

さまざまな理由 (オフライン テスト、パフォーマンスの向上など) から、そのアップロードをスタブ化する必要があります。

allow(S3StorageService).to receive(:upload_file) { |params| params[:pathname] }

そのスタブはファイル パスのみを返します。

于 2017-06-23T13:58:52.387 に答える