Я работаю с несколькими внешними процессами в своем приложении. Во время тестов вывод 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, и по какой-то причине я теряю цветовое кодирование, что также затрудняет отслеживание результатов теста.
Функции выборки и тест поможет сфокусировать ответ на этот вопрос. В его нынешнем виде слишком туманно отвечать, кроме как подсказка для перенаправления stderr в вызове System.cmd. –
@FredtheMagicWonderDog Я добавил основную иллюстрацию проблемы. Помогает ли это? –
Да, это очень помогает. –