如何验证是否已使用特定消息调用“puts”?

时间:2010-03-29 06:42:34

标签: ruby mocking rspec

我正试图让这个测试失败:)

it "should display the question" do
  @ui.should_receive(:puts).with("What's your name?").once
  @ui.ask_question("What's your name?")
end

即使我没有在我的函数中调用puts,它也会过去。

3 个答案:

答案 0 :(得分:3)

基本上,@ui应该在一个可能默认为$ stdout的对象上调用.puts。然后在测试中,您可以将$ stdout替换为可以设置期望值的StringIO对象。这样可以使您的@ui对象更加灵活。

答案 1 :(得分:1)

鉴于代码:

require 'rubygems'
require 'spec'

class UI
  def ask_question(q)
  end
end

describe UI do
  before do
    @ui = UI.new
  end

  it "should display the question" do
    @ui.should_receive(:puts).with("Whats your name?").once
    @ui.ask_question("Whats your name?")
  end
end

我得到了失败:

F

1) Spec::Mocks::MockExpectationError in 'UI should display the question'
#<UI:0xb738effc> expected :puts with ("Whats your name?") once, but received it 0 times /home/avdi/tmp/puts_spec.rb:15:

Finished in 0.002575 seconds

1 example, 1 failure

您使用的是什么版本的RSpec?

答案 2 :(得分:0)

您可以尝试stringioZenTest,以下ruby-talk thread有更多信息。