Как оценить блок Perl перед подтестом - PullRequest
4 голосов
/ 09 августа 2011

Я хочу раскрасить вывод описания подтеста на основе результата (пройден / не пройден) подтеста. Вот что у меня так далеко

sub run_subtest {
  my $desc = 'subtest description';

  subtest _construct_colored_description($desc) => sub { $passed = 1; #passed is global };
}

sub _construct_colored_description {
  my $desc = shift;
  return colored [$passed ? 'green' : 'red'], $desc;
}

Я use use Term::ANSIColor и видел цветной вывод. Однако переключение с красного на зеленый происходит в следующем подтесте. Например, я напечатал зеленые тесты, один не пройден, все еще печатает зеленый, а следующий - красный. Это говорит мне, что $passed и colored ... работают, но блок в subtest оценивается после того, как _construct_colored_description определяет цвет для вывода.

Для моего реального кода, проверьте мой проект github https://github.com/bostonaholic/test-more-behaviour

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 09 августа 2011

Вам нужно отложить оценку описания, одно из решений, которое приходит на ум, - это использовать для этого функцию обратного вызова. Идея состоит в том, чтобы вернуть замыкание из _construct_colored_description и запустить его в функции subtest:

my $passed = 0;

sub subtest {
    my ($desc_cb, $test_cb) = @_;
    $test_cb->();
    print $desc_cb->(),"\n";
}

sub _construct_colored_description {
    my $desc = shift;
    return sub { return $passed ? '[green]' : '[red]', $desc };
}

# testing with two subtests
my $desc = 'subtest description';
subtest _construct_colored_description($desc) => sub {
    $passed = 1;
};

$desc = 'subtest description2';
subtest _construct_colored_description($desc) => sub {
    $passed = 0;
};

Дает:

[green]subtest description
[red]subtest description2
...