【问题标题】:Testing output twice测试输出两次
【发布时间】:2016-06-10 03:44:06
【问题描述】:

是否可以测试输出两次?
这是代码

<?php
public function testAutoTriggerOff()
{
    $user = array(
        'id'=>1,
        'name'=>'Andy',
        'logTime'=> time()
        );
    $this->elevent->turnOffAutoTrigger();
    $this->elevent->attach('Elevent\Test\Event\UserHasLoggedIn', new WelcomeUser);
    $event = $this->elevent->setEvent('Elevent\Test\Event\UserHasLoggedIn', $user);
    $this->expectOutputString('');
    $this->elevent->trigger($event);
    $this->expectOutputString('Welcome, Andy');
}

所以,在调用 setEvent 之后,我想测试一下没有输出..
而且,在调用触发器后,我想测试输出是否为“欢迎,安迪”
此测试通过。
但是,如果我将第一个测试输出更改为应该为 false 的内容,例如

    $this->expectOutputString('this one should be false');
    $this->elevent->trigger($event);
    $this->expectOutputString('Welcome, Andy');

但是,测试也通过了。我预计它会失败,因为我想测试输出两次。
在触发之前,它应该没有输出。
触发后,输出应该是“Welcome, Andy”
那怎么测试呢?

【问题讨论】:

  • 你实际上是在测试两个不同的东西,所以你应该把它分成两个单独的单元测试。
  • @jeroen 不,我不测试不同的东西。我测试自动触发是否真的关闭。如果自动触发关闭,我需要调用触发方法来触发监听器..如果它打开,我不需要调用触发器,它是自动触发的,因为设置了事件..请帮助

标签: php unit-testing testing phpunit


【解决方案1】:

您的问题是expectOutputString 评估测试期间回显的内容。因此,如果你调用它两次,你就会用第二个期望覆盖第一个期望。

如果您考虑一下,输出是唯一的,您不能为单个测试提供 2 个不同的输出。

所以@jeroen 的评论是正确的。您需要一个测试来在触发事件之前检查输出是否为空,另一个用于在事件触发后检查输出。

看起来您的班级正在直接回显内容。这会降低它的可测试性。如果您使用 MVC 模式,您通常只有一个 echo 用于将响应内容发送到浏览器。

【讨论】:

  • 不回显内容,而是触发听者。听者中的“回声”只是为了测试..
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多