Test::Mojo + Prove приводит к дублированию журналов

У меня есть следующий тестовый скрипт, который использует Test::Mojo. Когда я запускаю его из командной строки с помощью Perl, он выводит правильно. Однако, когда я запускаю его через «доказать -v», журнал Mojo дублируется, и один из них не передается через «сообщение».

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More tests => 1;

use Mojolicious::Lite;
use Test::Mojo;

app->log->on(
    message => sub {
        my ( $log, $level, @lines ) = @_;
        note "MojoLog $level: @lines";
    }
);

get '/debug/mojo/req_url' => sub {
    my $c = shift;

    $c->render( text => $c->req->url );
};

subtest 'Mojo - $c->req->url' => sub {
    plan tests => 3;

    my $t = Test::Mojo->new;

    $t->get_ok('/debug/mojo/req_url')    #
        ->status_is(200)                 #
        ->content_is('/debug/mojo/req_url');
};

Вывод при прямом запуске:

$ perl dup_logging.t
1..1
# Subtest: Mojo - $c->req->url
    1..3
    # MojoLog debug: GET "/debug/mojo/req_url"
    # MojoLog debug: Routing to a callback
    # MojoLog debug: 200 OK (0.000797s, 1254.705/s)
    ok 1 - GET /debug/mojo/req_url
    ok 2 - 200 OK
    ok 3 - exact match for content
ok 1 - Mojo - $c->req->url

И вывод при прогоне доказывает:

$ prove -v dup_logging.t
dup_logging.t ..
1..1
# Subtest: Mojo - $c->req->url
    1..3
[Thu Mar  8 12:16:35 2018] [debug] GET "/debug/mojo/req_url"
    # MojoLog debug: GET "/debug/mojo/req_url"
[Thu Mar  8 12:16:35 2018] [debug] Routing to a callback
    # MojoLog debug: Routing to a callback
[Thu Mar  8 12:16:35 2018] [debug] 200 OK (0.000842s, 1187.648/s)
    # MojoLog debug: 200 OK (0.000842s, 1187.648/s)
    ok 1 - GET /debug/mojo/req_url
    ok 2 - 200 OK
    ok 3 - exact match for content
ok 1 - Mojo - $c->req->url
ok
All tests successful.
Files=1, Tests=1,  1 wallclock secs ( 0.03 usr  0.01 sys +  0.34 cusr  0.03 csys =  0.41 CPU)
Result: PASS

Ниже приведена информация о моей версии:

$ perl -MMojolicious -E 'say Mojolicious->VERSION'
7.14
$ prove --version
TAP::Harness v3.36 and Perl v5.16.3

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

$ENV{MOJO_LOG_LEVEL} = 'fatal';

Любые другие предложения о том, как заставить proof и Test::Mojo хорошо работать вместе в отношении ведения журнала?


person Miller    schedule 08.03.2018    source источник


Ответы (1)


Доказательство testrunner использует инфраструктуру TAP::Harness. Когда вы запустите prove -v, это установит переменную среды HARNESS_IS_VERBOSE.

Затем Mojo::Test получает эту переменную среды:

# Silent or loud tests
$ENV{MOJO_LOG_LEVEL} ||= $ENV{HARNESS_IS_VERBOSE} ? 'debug' : 'fatal';

Поэтому вы получаете сообщения журнала отладки Mojo при запуске prove -v.

Кажется, что ручная установка переменной env MOJO_LOG_LEVEL — лучший подход, если вам не нужен этот вывод.

person amon    schedule 08.03.2018
comment
Вы правы в том, что proof -v меняет MOJO_LOG_LEVEL с фатального на отладочный. Я несколько удивлен, что это приводит к дублированию регистрации. Я ожидал, что триггер сообщения переопределит другие потоки ведения журнала, но, похоже, это не так. - person Miller; 09.03.2018
comment
Возможно, это ошибка — вы могли бы узнать на канале #mojo? - person amon; 09.03.2018