0

我尝试使用 Rspec 编写最基本的测试,以测试标准输出上字符串的接收。

我已经以与 RSpec Book 中所写的方式完全相同的方式对标准输出进行了 stub,如下所示:

require './tweetag.rb'

 module Tweetag 
  describe Tweet do
    describe "#print" do
      it "prints test" do
        output = double('output').as_null_object
        t = Tweetag::Tweet.new(output)
        t.print
        output.should_receive(:puts).with('test')
   end
  end
 end 
end

Ruby 代码如下所示:

module Tweetag
  class Tweet
    def initialize(output)
      @output=output
    end

    def print
      @output.puts('test')
    end

  end
end

如您所见,没有什么复杂的。但是,运行规范后我收到的答案如下:

Failures:

  1) Tweetag::Tweet#print prints test
     Failure/Error: output.should_receive(:puts).with('test')
       (Double "output").puts("test")
           expected: 1 time
           received: 0 times

我试过删除“as_null_object”,然后答案是:

  1) Tweetag::Tweet#print prints test
     Failure/Error: t.print
       Double "output" received unexpected message :puts with ("test")

谢谢您的帮助。

4

1 回答 1

2

should_receive方法必须在实际调用该方法之前使用。

output = double('output').as_null_object
t = Tweetag::Tweet.new(output)
output.should_receive(:puts).with('test')
t.print

作为旁注,您的测试缺少对此处返回值的检查。您知道 print 方法不会引发任何异常。但是你没有检查返回值是否合适。

output.should_receive(:puts).with('test').and_return('returned value')
t.print.should eql('returned value')
于 2013-07-17T16:02:53.757 回答