Как проверить, что "Put" был вызван с определенным сообщением - PullRequest
3 голосов
/ 29 марта 2010

Я пытаюсь сделать этот тест неудачным:)

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

В настоящий момент оно проходит, даже если я не вызываю, вставляет свою функцию.

Ответы [ 3 ]

3 голосов
/ 29 марта 2010

По сути, @ui должен вызывать .puts для объекта, который по умолчанию имеет значение $ stdout. Затем в своих тестах вы можете заменить $ stdout объектом StringIO, на который вы можете установить ожидания. Это дает дополнительное преимущество, делая ваш объект @ui более гибким.

1 голос
/ 29 марта 2010

С учетом кода:

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 вы используете?

0 голосов
/ 29 марта 2010

Вы можете попробовать stringio или ZenTest , следующий ruby-talk thread содержит больше информации.

...