gpt4 book ai didi

php - 不使用 PHPUnit 测试 protected /私有(private)方法时的代码覆盖率

转载 作者:可可西里 更新时间:2023-11-01 12:57:36 27 4
gpt4 key购买 nike

我知道可以使用反射或其他变通方法测试 PHPUnit 的私有(private)/ protected 方法。

但大多数消息来源告诉我,为类内部的私有(private)方法编写测试不是最佳实践。

您应该像测试“黑匣子”一样测试该类 — 您只需通过比较输入和输出来测试预期行为,而不考虑内部机制。为类编写测试还应该通过显示缺少代码覆盖率来通知您未使用的私有(private)方法。

当我测试我的类并生成 HTML 报告时,它显示私有(private)方法未被测试覆盖,即使调用它们的行已完全执行/覆盖。我知道私有(private)方法已执行,因为如果它们不执行,我的类上的断言将不会通过。

这是 PHPUnit 中的预期行为吗?我能否争取 100% 的覆盖率,同时仍然仅间接地测试私有(private)方法?

一些简化的示例代码(在 Symfony2 中使用 RestBundle):

class ApiController extends FOSRestController {

/*
* @REST\View()
* @REST\Get("/api/{codes}")
*/
public function getCodesAction($codes) {
$view = new View();
$view->setHeader('Access-Control-Allow-Origin', '*');
$view->setData(array('type' => 'codes','data' => $this->_stringToArray($codes)));
$view->setFormat('json')->setHeader('Content-Type', 'application/json');
return $this->handleView($view);
}

private function _stringToArray($string){
return explode('+',$string);
}

公共(public)函数显示为“被覆盖”,私有(private)函数被间接覆盖但在 PHPUnit 报告中显示为红色。

测试:

class ApiControllerTest extends WebTestCase {

public function test_getCodesAction(){
$client = static::createClient();
$client->request('GET', '/api/1+2+3');
$this->assertContains('{"type": "codes", "data": [1,2,3]}', $client->getResponse()->getContent());
}

}

这当然只是一个愚蠢的例子,我也可以在公共(public)函数中包含 explode();但是我正在为其编写测试的 Controller 包含更复杂和可重用的私有(private)函数,这些函数以更复杂的方式转换数据(但仍然没有副作用)。

最佳答案

在 Phpunit 中,您可以使用特殊注释指定涵盖的方法,如 doc 中所述。 .

你可以这样做:

    class ApiControllerTest extends WebTestCase {

/**
* @covers ApiController::getCodesAction
* @covers ApiController::_stringToArray
*/
public function test_getCodesAction(){
$client = static::createClient();
$client->request('GET', '/api/1+2+3');
$this->assertContains('{"type": "codes", "data": [1,2,3]}', $client->getResponse()->getContent());
}

}

希望对你有帮助

关于php - 不使用 PHPUnit 测试 protected /私有(private)方法时的代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31586942/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com