【发布时间】:2012-01-11 15:51:28
【问题描述】:
我正在为我的 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);
}
有什么语法可以让单元测试更短更易读吗?例如,与其说“这个对象是一个将调用这个方法的模拟对象,当在它上面调用这个方法时,它将用这个参数调用一次并返回这个值”,如果我能只要说once(object->method(argument)) => $returnvalue之类的话。
【问题讨论】:
-
只是一个想法:我确信这不适用于其他人,但是当我的单元测试看起来越来越荒谬时,我经常发现问题是我的代码设计/分离不理想:)
标签: php unit-testing mocking phpunit