2015-04-23 1 views
3

Я работаю с несколькими внешними процессами в своем приложении. Во время тестов вывод stderr из нескольких из них выводится в ряд с моими тестовыми сообщениями и результатами. Я могу это сделать:Подавить stderr во время работы Mix Test в Elixir

mix test --trace 2> error.log 

Однако, когда я это делаю, я теряю все свои прекрасные цвета. Также появляются некоторые ошибки Elixir, хотя и не все (что для меня хорошо).

Есть ли лучший способ подавить ошибки внешних программ, не влияя на выход микширования? Это даже хорошая идея?

Или должны ли мои тесты не взаимодействовать с реальными утилитами командной строки? Я спрашиваю, потому что в этот момент я честно уже не понимаю, что я тестирую.

ОБНОВЛЕНИЕ:

Ниже представлена ​​упрощенная функция и испытания, чтобы проиллюстрировать концепцию лучше.

Функция:

@doc "Function takes a pre-routing rule as a string and adds it with iptables" 
def addrule(pre_routing_rule) 
    %Porcelain.Result{out: _output, status: status} = Porcelain.shell("sudo iptables -t nat -A #{pre_routing_rule}") 
end 

Тест:

test "Removing a non-existent rule fails" do 
    Rules.clear 
    assert {:error, :eiptables} == Rules.remove("PREROUTING -p tcp --dport 9080 -j DNAT --to-destination 192.168.1.3:9080") 
end 

Этот тест проходит отлично. Однако встроенный с тестовыми сообщениями также выводит iptables: No chain/target/match by that name.. Точная позиция сообщения также непредсказуема, и в массовом порядке эти сообщения затрудняют чтение тестовой информации. Затем я перенаправляю stderr, и по какой-то причине я теряю цветовое кодирование, что также затрудняет отслеживание результатов теста.

+0

Функции выборки и тест поможет сфокусировать ответ на этот вопрос. В его нынешнем виде слишком туманно отвечать, кроме как подсказка для перенаправления stderr в вызове System.cmd. –

+0

@FredtheMagicWonderDog Я добавил основную иллюстрацию проблемы. Помогает ли это? –

+0

Да, это очень помогает. –

ответ

1

Я бы предложил в целом, что вы решаете, как бороться со stderr в ваших системных вызовах. Что происходит, так это то, что тестовая среда ловит stdout, но не stderr.

Вы можете изменить, как STDERR рассматриваются в первоначальном вызове фарфорового См

Porcelain API Docs

+0

Просто дополнительная заметка об этом. Фарфор может перенаправить stderr на различные выходы. Однако он работает только при использовании драйвера Goon. Без драйвера goon вы можете перенаправить stderr на выход (т. Е. Присоединить ошибку к stdout).Goon - это отдельный бинарный файл, который необходимо использовать в вашем PATH или в рабочем каталоге вашего приложения. –

2

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

Отсутствие цветов связано с тем, как Elixir detects ANSI:

[Поддержка ANSI] по умолчанию ложным, если Эликсир не может обнаружить во время запуска, что и стандартный вывод и стандартный поток ошибок являются терминалы.

+0

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

+0

Elixir знает, когда его вывод текста на терминал стихирует файл и удаляет биты, которые раскрашивают текст при записи в файл. См. IO.Ansi –

+0

Спасибо. Это хорошо знать. –

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