10

私がこのクラスを持っているとしましょう

class Foo
  def bar(param1=nil, param2=nil, param3=nil)
     :bar1 if param1
     :bar2 if param2
     :bar3 if param3
  end
end

以下を使用して、バー全体のメソッドをスタブできます。

Foo.any_instance.expects(:bar).at_least_once.returns(false)

ただし、bar メソッドの param1 が true の場合にのみスタブしたい場合は、方法が見つかりませんでした。

with と has_entry も調べましたが、単一のパラメーターにのみ適用されるようです。

このような機能を期待していました。

Foo.any_instance.expects(:bar).with('true',:any,:any).returns(:baz1)
Foo.any_instance.expects(:bar).with(any,'some',:any).returns(:baz2)

ありがとう

................................................................... . 以下を編集 .................................................................

ありがとう、ナッシュ

rspecに慣れていないので、any_instanceで単体テストしてみたところうまくいきそうです

require 'test/unit'
require 'mocha'

class FooTest < Test::Unit::TestCase 

  def test_bar_stub 
    foo = Foo.new
    p foo.bar(1)

    Foo.any_instance.stubs(:bar).with { |*args| args[0]=='hee' }.returns('hee')
    Foo.any_instance.stubs(:bar).with { |*args| args[1]=='haa' }.returns('haa')
    Foo.any_instance.stubs(:bar).with { |*args| args[2]!=nil   }.returns('heehaa')

    foo = Foo.new
    p foo.bar('hee')
    p foo.bar('sth', 'haa')
    p foo.bar('sth', 'haa', 'sth')
  end

end
4

1 に答える 1

10

私があなたを正しく理解した場合、それは次のようなものになる可能性があります:

class Foo
  def bar(param1=nil, param2=nil, param3=nil)
     :bar1 if param1
     :bar2 if param2
     :bar3 if param3
  end
end

describe Foo do
  it "returns 0 for all gutter game" do
    foo = Foo.new
    foo.stub(:bar).with { |*args| args[0] }.and_return(:bar1)
    foo.stub(:bar).with { |*args| args[1] }.and_return(:bar2)
    foo.stub(:bar).with { |*args| args[2] }.and_return(:bar3)
    foo.bar(true).should == :bar1
    foo.bar('blah', true).should == :bar2
    foo.bar('blah', 'blah', true).should == :bar3
  end
end
于 2012-03-09T19:35:38.433 に答える