Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对打印到屏幕上的Perl函数进行单元测试?_Perl_Unit Testing_Testing - Fatal编程技术网

如何对打印到屏幕上的Perl函数进行单元测试?

如何对打印到屏幕上的Perl函数进行单元测试?,perl,unit-testing,testing,Perl,Unit Testing,Testing,我试图使用它对打印到屏幕上的Perl函数进行单元测试 我理解此输出可能会干扰工具,例如 如何捕获此输出,以便使用diag()打印它,并对输出本身运行测试?更新:IMHO,此问题的正确答案应该是使用: 输出: C:\Temp> tm 1..1 ok 1 - myfunc() returns test output C:\Temp> tm 1..1 ok 1 - myfunc() prints test string # myfunc() printed 'This is a test' 输出: C

我试图使用它对打印到屏幕上的Perl函数进行单元测试

我理解此输出可能会干扰工具,例如


如何捕获此输出,以便使用
diag()
打印它,并对输出本身运行测试?

更新:IMHO,此问题的正确答案应该是使用:

输出:

C:\Temp> tm 1..1 ok 1 - myfunc() returns test output C:\Temp> tm 1..1 ok 1 - myfunc() prints test string # myfunc() printed 'This is a test' 输出:

C:\Temp> tm 1..1 ok 1 - myfunc() returns test output C:\Temp> tm 1..1 ok 1 - myfunc() prints test string # myfunc() printed 'This is a test' C:\Temp>tm 1..1 ok 1-myfunc()打印测试字符串 #myfunc()打印了“这是一个测试”
对于早于5.8的
perl版本,您可能需要使用,但我不太了解5.8之前的工作原理。

我会考虑让模块为您处理这个问题。查看。

如果这是您自己编写的代码,请更改它,使打印语句不使用默认文件句柄。相反,请为自己提供一种将输出文件句柄设置为任意值的方法:

sub my_print { my $self = shift; my $fh = $self->_get_output_fh; print { $fh } @_; } sub _get_output_fh { $_[0]->{_output} || \*STDOUT } sub _set_output_fh { $_[0]->{_output} = $_[1] } # add validation yourself 子我的_打印{ 我的$self=shift; my$fh=$self->\u获取\u输出\u fh; 打印{$fh}@; } sub{u get_output_fh{$\[0]->{u output}{124; \\*STDOUT} 子_集_输出_fh{$\[0]->{_输出}=$\[1]}自己添加验证 当您进行测试时,可以调用
\u set\u output\u fh
为其提供测试文件句柄(甚至可能是一个句柄)。当另一个人想使用您的代码但捕获输出时,他们不必向后弯腰去做,因为他们可以提供自己的文件句柄


当你发现你的代码中有一部分很难测试,或者你不得不跳转去处理时,你的设计可能很糟糕。我仍然对测试代码如何让这些事情变得显而易见感到惊讶,因为我通常不会去想它们。如果很难测试,就让它容易测试。如果你这样做,你通常会赢。

就在我认为我在这上面浪费了太多时间的时候,我学到了一些很酷的东西!谢谢。嗯,从技术上讲,他们不喜欢,但如果他们喜欢,那就太好了p(+1,这是一个很棒的模块)我没有投反对票,但我认为原始答案做了太多工作,无法完成任务。太复杂了。虽然我有点偏向于Test::Output,但我还是把它作为最后的手段使用。+1是为了有用。在我众多的库中,很少有库在输出上打印出任何值得测试的内容,所以我以前从未遇到过这一个。。。有一本书“Intermediate Perl”有一章“测试简介”,其中一个练习告诉您使用“is”测试某个包的子例程的输出,让您挂起,花了一段时间才明白这是我应该做的。也许作者希望我们(因为我们当时是“中间人”)知道如何使用Test::Output,但我不知道我们应该如何知道,我的意思是,据我所知,我不是一个透视者。。。不过谢谢你,这让我摆脱了两天的习惯。阿门。编写单元测试(或者如果你做了TDD,不管你知道与否,为它们做计划)通常会带来显著的设计改进。