我想根据子测试的结果(通过/失败)为子测试描述的输出着色。这是我到目前为止所得到的
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
感谢您的帮助!
答案 0 :(得分:2)
你需要推迟对描述的评估,一个想到的解决方案就是使用回调。我们的想法是从_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