2015-12-18 2 views
2

Мне нужно написать несколько тестов для проверки вывода на STDERR с помощью minitest
Это нормально работает, если я хочу проверить вывод на STDOUT, но если попробовать проверить STDERR - asser_output просто не поймать строка в немНеверная проверка `assert_output` для stderr

Так что мой код выглядит следующим образом:

require 'minitest/autorun' 

class OutputTest < MiniTest::Test 
    def test_output_stdout 
    assert_output(/Test/, '') {puts 'Test'} 
    end 

    def test_output_stderr 
    assert_output('', /Test/) {STDERR.puts 'Test'} 
    end 
end 

И это дает мне ошибку:

1) Failure: 
OutputTest#test_output_stderr [test/assert_test.rb:9]: 
In stderr. 
Expected /Test/ to match "". 

2 runs, 4 assertions, 1 failures, 0 errors, 0 skips 

F rom assert_outputdocumentation Второй аргумент этого метода - шаблон для проверки STDERR, но он не работает. Что я сделал не так?

+1

Вместо 'STDERR.puts' вы можете использовать просто' warn', который должен работать. – sschmeck

ответ

3

Это работает, если вы используете $stderr вместо STDERR:

assert_output('', /Test/) { $stderr.puts 'Test' } 

Внутренне assert_output использует capture_io помощника. Это свопы $stdout и $stderr с двумя StringIO, дает блок и свопит $stdout и $stderr назад. Это возможно, потому что $stdout и $stderr являются переменными.

STDOUT и STDERR - константы, определенные на классе Object. Таким образом, они не могут быть заменены как $stdout и $stderr. При выполнении STDERR.puts выход не захватывается миниатюрными помощниками, и утверждение не выполняется.

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