2016-03-24 5 views
0

Я хотел бы проверить вывод следующего метода:RSpec тест петельного выхода

def print_books 
    @books.each do |book| 
    puts "#{book.id}. #{book.name}" 
    end 
end 

Моего RSpec код выглядит как:

before(:all) do 
@library = Library.new 
end 

it "prints the correct names with ascendant ids" do 
    expect(STDOUT).to receive(:puts).with("4. Harry Potter","8. Lord of the Rings") 
    @library.print_books 
end 

Проблема только первая книга напечатана, как и Я думаю, что учитывается только первый результат.

+0

Как инициализируется библиотека? – alkuzad

+0

Я обновил описание, библиотека инициализируется текстовым файлом, содержащим в каждой строке. Книги как объекты JSON. – Viro

+0

О, круто, да. Спасибо – alkuzad

ответ

1

Когда вы пишете with(a, b), вы говорите RSpec вы ожидаете, что метод будет называться раз с аргументами a, b. Например, это пройдет:

it 'prints' do 
    expect(STDOUT).to receive(:puts).with(1, 2) 
    puts 1, 2 
end 

Вы пытаетесь сделать что-то другое; вы хотите, чтобы puts был вызван с book_a, а затем снова вызвал с book_b. Вы можете использовать ordered, чтобы указать это на RSpec.

it 'prints each book' do 
    expect(STDOUT).to receive(:puts).with('1. Harry Potter').ordered 
    expect(STDOUT).to receive(:puts).with('8. Lord of the Rings').ordered 
    @library.print_books 
end 

RSpec теперь проверить, что puts называется первым с "1. Harry Potter", затем с "8. Lord of the Rings". Если его нет, имеется третья книга или вызовы выполняются в неправильном порядке, тест не удастся.

+0

Отличный ответ, спасибо @ Kristjan – Viro

Смежные вопросы