如何使我的PHPUnit测试更简洁,更短?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使我的PHPUnit测试更简洁,更短?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2901字,纯文字阅读大概需要5分钟。
内容图文
我为Web应用程序编写的PHPUnit测试因其长度和不透明性而使我丧命.似乎测试中的代码比他们正在测试的代码多一个数量级.
例如,假设我的网站上有一个CatController对象,此方法是:
public function addCat(Default_Model_Cat $cat)
{
$workflow = $this->catWorkflowFactory->create(array($this->serviceExecutor));
$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->serviceExecutor = $this->getMockBuilder('ServiceExecutor')
->disableOriginalConstructor()
->getMock();
$controller->catWorkflowFactory = $this->getMockBuilder('Factory')
->disableOriginalConstructor()
->setMethods(array('create'))
->getMock();
$controller->catWorkflowFactory->expects($this->once())
->method('create')
->with($controller->serviceExecutor)
->will($this->returnValue($workflow));
$controller->addCat($cat);
}
有什么语法可以使单元测试更短,更容易阅读?例如,与其说“此对象是一个将在其上调用此方法的模拟对象,然后在此方法上调用它然后将使用此参数调用一次并返回此值”,不如说是只是说一次(object-> method(argument))=> $returnvalue.
解决方法:
您可以将类设计为可在单元测试中使用而不被模拟的内容越多,则需要编写的模拟代码就越少.但是对于上面的示例,我的第一反应是该方法不需要单元测试,因为它实际上并没有执行任何逻辑,并且在编写后也不会更改.
话虽如此,假设您在此类的其他方法中将需要工作流实例,请将将其创建的代码提取到新方法中.这使您可以为每个测试模拟该方法,而在一个测试中仅具有更长的模拟时间.
例如,如果您还具有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->serviceExecutor));
}
上面的方法非常简短,并且实际上不需要单元测试,但是现在它们要短一些:
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测试更简洁,更短?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。