【问题标题】:PHPUnit Testing for JSON OutputJSON 输出的 PHP 单元测试
【发布时间】:2013-04-25 23:10:14
【问题描述】:

为什么我不能获取输入并测试它是否不为空?

我正在测试的方法:

/**
 * @method: getCategory
 * retrieves the categories
 * @return json category data
 */
public function getCategory() {

    $cat = $this->em->getRepository('Entities\Category')->findAll();
    $data = array();
    foreach ($cat as $res) {
        $data[] = array(
            'catId' => $res->__get('catId'),
            'category' => $res->__get('category'),
            'item' => $res->__get('item')
        );
    }
    echo json_encode($data);
}

我的测试:

 /**
 * @covers Category::getCategory
 * @todo   Implement testGetCategory().
 */
public function testGetCategory() {
    $json = $this->object->getCategory();
    $this->assertNotNull($json);
}

错误信息,它返回一个 JSON 对象数组:

Sebastian Bergmann 的 PHPUnit 3.7.8。

F[{"catId":1,"category":"FLORALS2","item":"RED ROSES"}, {"catId":2,"category":"TENTS","item":"12X14"}, {"catId":3,"category":"FLORAL","item":"WHITE ROSES"}, {"catId":4,"category":"TENTS","item":"15X24"}, {"catId":5,"category":"CHAIRS","item":"BLACK CHAIR"}, {"catId":6,"category":"CHAIRS","item":"RED CHAIRS"}, {"catId":7,"category":"TENTS","item":"23X23"}, {"catId":8,"category":"CANDLES","item":"RED CANDLES"}, {"catId":9,"category":"CANDLES","item":"WHITE CANDLES"}, {"catId":10,"category":"CANDLES","item":"BLACK CANDLES"}, {"catId":11,"category":"CANDLES","item":"ORANGE CANDLES"}, {"catId":12,"category":"TABLE","item":"4X8 TABLE"}, {"catId":13,"category":"DRAPERYS","item":"24\" WHITE LINEN"}, {"catId":14,"category":"LINEN","item":"WHITE CURTAINS"}, {"catId":17,"category":"DRAPERY","item":"SILK TABLE CLOTH"}, {"catId":18,"category":"FLORAL","item":"ORANGE DAISIES"}]..

时间:0 秒,内存:10.25Mb

有 1 次失败:

1) CategoryTest::testGetCategory 断言 null 不是 空。

/var/www/praiseDB/tests/controller/CategoryTest.php:42

【问题讨论】:

  • assertXXXX 基本上与您的想法相反。例如,当文本为 Null 时,assertNotNull 将抛出断言。您的 $json 为 NULL,因为它已回显,未返回。

标签: php doctrine-orm phpunit


【解决方案1】:

您的 getCategory() 函数呼应了一些东西:

echo json_encode($data);

但它不返回任何东西。 因此 $json 变量在您的测试中将为空。

您可能打算在函数末尾返回值:

return json_encode($data);

要测试输出,您需要在测试中使用 expectOutputString() 或 expectOutputRegex() 方法。要测试非空输出,我认为应该执行以下操作:

/**
 * @covers Category::getCategory
 * @todo   Implement testGetCategory().
 */
public function testGetCategory() {
    $this->expectOutputRegex('/./');
    $this->object->getCategory();
}

有关如何断言输出的详细信息,请参阅phpunit documentation

【讨论】:

  • 是的,这就是它应该返回的方式。我有一个 ajax 调用来获取请求。显然我无法以这种方式对其进行测试,那么如何测试该方法是否与某些内容相呼应?
  • 忘了说这是一个控制器方法。由于这是返回输出,我需要编写一个测试来验证控制器方法是否返回输出,但我找不到任何好的示例或教程。
  • 好的,所以回显确实是您想要的,我编辑了我的答案以添加一些有关如何使用 phpunit 断言输出的详细信息
  • 遇到了同样的问题,花了我 4 小时才知道...感谢您的回答,拯救了我的一天 :)
猜你喜欢
  • 2011-02-04
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多