Zend framework 测试策略。zend框架控制器集成/烟雾测试中的PHPUnit模拟
我有一个复杂的后端应用程序,使用zf 1.11.11和phpunit 3.5.15。应用程序有一些复杂的通信组件(soap、rest等)。在CIS或dev测试环境中,我必须模拟这个模型,因为我无法建立到生产性第三方后端的连接或请求。因此,模拟unittest层的效果非常好。全覆盖-没问题。问题是我不能在控制器集成测试期间使用这种技术。它是一个更高的层,完全隐藏模型。所以我想在这一点上注入mock是不可能的。一方面,这是正确和好的,因为这是集成测试的本质,另一方面,我对控制器测试的覆盖率非常低 问题摘要:Zend framework 测试策略。zend框架控制器集成/烟雾测试中的PHPUnit模拟,zend-framework,tdd,phpunit,integration-testing,Zend Framework,Tdd,Phpunit,Integration Testing,我有一个复杂的后端应用程序,使用zf 1.11.11和phpunit 3.5.15。应用程序有一些复杂的通信组件(soap、rest等)。在CIS或dev测试环境中,我必须模拟这个模型,因为我无法建立到生产性第三方后端的连接或请求。因此,模拟unittest层的效果非常好。全覆盖-没问题。问题是我不能在控制器集成测试期间使用这种技术。它是一个更高的层,完全隐藏模型。所以我想在这一点上注入mock是不可能的。一方面,这是正确和好的,因为这是集成测试的本质,另一方面,我对控制器测试的覆盖率非常低 问
- 我无法创建与组件通信的测试服务(成本高)
- 我不能在控制器测试期间注入组件模拟(我只设置请求数据并触发调度程序)
- 我在控制器上的覆盖率太低了
我看到了一个解决方案,它将所有功能都实现为一个插件。因此,一些名称空间重定向可以指向模拟插件。但我认为这不是一个好的解决方案。修复可测试类上的依赖注入问题,添加以下函数,或注入构造函数
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
了解没有“适当”的保险金额
是的,我确切地知道单元测试和集成测试之间的区别。在这个问题上,我从来没有把他们放在同一个水平上。phpunit/zf1控制器测试()不允许您“直接”访问控制器。这是有意的!很好!你只会触发调度器。您无法访问较低的组件。只针对请求和响应。您应该将您的逻辑推到模型中,控制器中几乎没有要测试的内容。例如,所有依赖项和服务都应该通过模型访问。使用我上面提到的第一部分将依赖项注入到模型中。例如,我们甚至不在我的项目上测试我们的控制器。。。