2012-07-18 142 views
3

我有一个复杂的后端应用程序,使用zf 1.11.11和phpunit 3.5.15。该应用程序有一些复杂的通信组件(肥皂,休息等)。在CIS或开发测试环境中,我不得不嘲笑这些模型,因为我无法建立连接或请求生产第三方后端。因此嘲笑单元测试图层非常好。全面覆盖 - 没问题。问题是我不能在控制器集成测试中使用这种技术。它是一个完全隐藏模型的更高层。所以我想现在注入mock是不可能的。一方面,这是正确和好的,因为这是集成测试的本质,另一方面,我对控制器测试的覆盖率非常低。测试策略。 PHPUnit模拟Zend框架控制器集成/烟雾测试

摘要的问题:

  • 我不能创建传送给commponents(高费用)
  • 我不能注入组件控制器测试期间嘲笑(测试服务我只设置请求数据并触发调度员)
  • 我控制器上覆盖的方式对低

我已经看到了它实现了所有作为一个插件的解决方案。所以有些名称空间重定向可以指向模拟插件。但我不认为这是一个好的解决方案。

回答

0

修复您的可测试类的依赖注入问题,添加以下函数或注入构造函数。

function setDependentProperty(Type $value) 
{ 
    $this->_dependency = $value; 
    return $this; 
} 

function getDependentProperty() 
{ 
    if (!isset($this->_dependency)) { 
     $this->_dependency = new DependencyType(); 
    } 
    return $this->_dependency; 
} 

然后用嘲弄的测试

function testUseMockedService() 
{ 
    $testedItem = new ObjectToTest(); 
    $mock = $this->getMock('Service_ToMock', 
     array('functionToMock') 
    ); 
    $mock->expects($this->exactly(1)) 
     ->method('functionToMock') 
     ->will($this->returnValue($valueYouWant)); 

    $testedItem->setDependency($mock); 
    $returnValue = $testedItem->doStuff(); 

    $this->assertEquals($something, $returnValue); 
} 

明白,单元测试是不集成测试,应该是很孤立的

http://www.typemock.com/unit-tests-integration-tests 

明白,有报道没有“权利”量

http://www.artima.com/weblogs/viewpost.jsp?thread=204677

+0

是的我完全知道单元测试和集成测试之间的区别。我从来没有把它们设置在问题的同一层次上。 phpunit/zf1控制器测试(http://framework.zend.com/manual/de/zend.test.phpunit.html)不会给你对控制器的“直接”访问。这是打算!好的!你只触发调度员。您无权访问较低的组件。只有要求和回应。 – jami 2012-07-18 18:55:31

+0

您应该将自己的逻辑推向模型,在控制器中应该几乎没有任何东西需要测试。例如,应该通过模型访问所有的依赖关系和服务。使用上面我介绍的第一部分将依赖注入到模型中。作为例子,我们甚至不在我的项目上测试我们的控制器... – 2012-07-19 23:45:26