2012-03-09 22 views
6

Giả sử rằng tôi có lớp nàysử dụng mocha, có cách nào để khai thác với nhiều thông số không?

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

tôi có thể còn sơ khai phương pháp toàn thanh bằng:

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

Tuy nhiên nếu tôi chỉ muốn còn sơ khai khi param1 của phương pháp thanh là sự thật, tôi không thể tìm cách để làm:

Tôi cũng đã xem xét, và has_entry, và có vẻ như nó chỉ áp dụng cho một tham số duy nhất.

Tôi đã mong đợi một số chức năng như thế này.

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

Cảm ơn

...................................... ............. CHỈNH SỬA THEO D FI .................................. ...........

Cảm ơn, nash

Không quen thuộc với rspec, vì vậy tôi đã thử với bài kiểm tra đơn vị với any_instance, và có vẻ như làm việc

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 
+0

hy vọng thay vì cuống cũng hoạt động tốt cho tôi. Foo.any_instance.expects (: bar) .với {| * args | args [0] == 'hee'} .returns ('hee') – allenhwkim

Trả lời

7

Nếu tôi nhận được quyền của bạn, có thể giống như sau:

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 
Các vấn đề liên quan