我有一个复杂的后端应用程序,使用 zf 1.11.11 和 phpunit 3.5.15。该应用程序有一些复杂的通信组件(soap、rest 等)。在 CIS 或开发测试环境中,我必须模拟此模型,因为我无法与高效的第三方后端建立连接或请求。因此,通过模拟单元测试层效果非常好。全面覆盖-没问题。问题是我无法在 Controller 集成测试期间使用此技术。它是一个更高的层,完全隐藏模型。所以我想此时注入(inject)模拟是不可能的。一方面,这是正确且良好的,因为这是集成测试的本质,另一方面,我在 Controller 测试上的覆盖率非常低。
问题总结:
- 我无法创建与组件通信的测试服务(成本很高)
- 我无法在 Controller 测试期间注入(inject)组件模拟(我仅设置请求数据并触发调度程序)
- 我对 Controller 的覆盖率太低
我见过一个将所有内容都实现为插件的解决方案。这样一些命名空间重定向就可以指向模拟插件。但我不认为这是一个好的解决方案。
最佳答案
修复可测试类上的依赖注入(inject)问题,添加以下函数,或注入(inject)到构造函数中。
function setDependentProperty(Type $value)
{
$this->_dependency = $value;
return $this;
}
function getDependentProperty()
{
if (!isset($this->_dependency)) {
$this->_dependency = new DependencyType();
}
return $this->_dependency;
}
然后在测试中使用Mock
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
了解没有“正确”的覆盖范围
关于zend-framework - 测试策略。 PHPUnit 在 zend 框架 Controller 集成/冒烟测试中进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11540303/