PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使我的PHPUnit测试更简洁,更短?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我为Web应用程序编写的PHPUnit测试因其长度和不透明性而使我丧命.似乎测试中的代码比他们正在测试的代码一个数量级.

例如,假设我的网站上有一个CatController对象,此方法是:

public function addCat(Default_Model_Cat $cat)
{
    $workflow = $this->catWorkflowFactory->create(array($this->@R_607_9260@ceExecutor));
    $workflow->addCat($cat);
}

我必须创建以进行彻底测试的单元测试将是这样的

public function testAddCat()
{
    $cat = $this->getmockBuilder('Default_Model_Cat')
        ->disabLeoriginalConstructor()
        ->getmock();
    $controller = $this->getmockBuilder('CatController')
        ->disabLeoriginalConstructor()
        ->setMethods(array('none'))
        ->getmock();
    $workflow = $this->getmockBuilder('Default_Model_Workflow_Cat')
        ->setMethods(array('addCat'))
        ->disabLeoriginalConstructor()
        ->getmock();
    $workflow->expects($this->once())
        ->method('addCat')
        ->with($cat);
    $controller->@R_607_9260@ceExecutor = $this->getmockBuilder('@R_607_9260@ceExecutor')
        ->disabLeoriginalConstructor()
        ->getmock();
    $controller->catWorkflowFactory = $this->getmockBuilder('Factory')
        ->disabLeoriginalConstructor()
        ->setMethods(array('create'))
        ->getmock();
    $controller->catWorkflowFactory->expects($this->once())
        ->method('create')
        ->with($controller->@R_607_9260@ceExecutor)
        ->will($this->returnValue($workflow));
    $controller->addCat($cat);
}

有什么语法可以使单元测试更短,更容易阅读?例如,与其说“此对象是一个将在其上调用方法的模拟对象,然后在此方法调用它然后将使用此参数调用一次并返回此值”,不如说是只是说一次(object-> method(argument))=> $returnvalue.

解决方法:

您可以将类设计为可在单元测试中使用而不被模拟的内容越多,则需要编写的模拟代码就越少.但是对于上面的示例,我的第一反应是该方法不需要单元测试,因为它实际上并没有执行任何逻辑,并且在编写后也不会更改.

如此,假设您在此类的其他方法中将需要工作流实例,请将将其创建的代码@L_772_19@到新方法中.这使您可以为每个测试模拟该方法,而在一个测试中仅具有更长的模拟时间.

例如,如果您还具有removeCat()方法,则它将如下所示:

public function addCat(Default_Model_Cat $cat) {
    $this->createWorkflow()->addCat($cat);
}

public function removeCat(Default_Model_Cat $cat) {
    $this->createWorkflow()->removeCat($cat);
}

public function createWorkflow() {
    return $this->catWorkflowFactory->create(array($this->@R_607_9260@ceExecutor));
}

上面的方法@R_837_10584@,并且实际上不需要单元测试,但是现在它们要短一些:

public function testAddCat() {
    $cat = $this->getmockBuilder('Default_Model_Cat')
        ->disabLeoriginalConstructor()
        ->getmock();
    $controller = $this->getmockBuilder('CatController')
        ->disabLeoriginalConstructor()
        ->setMethods(array('createWorkflow'))
        ->getmock();
    $workflow = $this->getmockBuilder('Default_Model_Workflow_Cat')
        ->setMethods(array('addCat'))
        ->disabLeoriginalConstructor()
        ->getmock();
    $controller->expects($this->once())
        ->method('createWorkflow')
        ->will($this->returnValue($workflow));
    $workflow->expects($this->once())
        ->method('addCat')
        ->with($cat);
    $controller->addCat($cat);
}

如果控制器中有许多这样的方法,则可以在测试用例中创建辅助方法来创建模拟.最后,您真的需要在模拟中禁用原始构造函数吗?我很少需要自己做.

大佬总结

以上是大佬教程为你收集整理的如何使我的PHPUnit测试更简洁,更短?全部内容,希望文章能够帮你解决如何使我的PHPUnit测试更简洁,更短?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: