4

rspecを使用して2つのユーザー入力を受け取るメソッドをスタブするにはどうすればよいですか?出来ますか?

class Mirror
    def echo
        arr = []
        print "enter something: "
        arr[0] = gets.chomp
        print "enter something: "
        arr[1] = gets.chomp

        return arr
    end
end



describe Mirror do

    it "should echo" do
        @mirror = Mirror.new
        @mirror.stub!(:gets){   "foo\n" }
        @mirror.stub!(:gets){   "bar\n" }
        arr = @mirror.echo
        #@mirror.should_receive(:puts).with("phrase")
        arr.should eql ["foo", "bar"]

    end

end

これらの仕様では、@ mirror.echoからの戻り値は["bar"、 "bar"]であり、最初のスタブが上書きされるか、無視されることを意味します。

また、@ mirror.stub!(:gets){"foo \ nbar \ n"}を使用してみましたが、@mirror.echoは["foo\ nbar \ n"、 "foo \ nbar\n"]を返します。

4

1 に答える 1

6

and_returnメソッドを使用すると、メソッドが呼び出されるたびに異なる値を返すことができます。

@mirror.stub!(:gets).and_return("foo\n", "bar\n")

そして、あなたのコードはこのようになります

it "should echo" do
  @mirror = Mirror.new
  @mirror.stub!(:gets).and_return("foo\n", "bar\n")
  @mirror.echo.should eql ["foo", "bar"]
end

使用例and_return

counter.stub(:count).and_return(1,2,3)
counter.count # => 1
counter.count # => 2
counter.count # => 3
counter.count # => 3
counter.count # => 3
于 2013-03-24T22:57:58.613 に答える