我有一个复杂的后端应用程序,使用zf 1.11.11和phpunit 3.5.15。该应用程序有一些复杂的通信组件(肥皂,休息等)。在CIS或开发测试环境中,我必须模拟这些模型,因为我无法与高效的第三方后端建立连接或请求。因此,通过模拟单元测试层的工作非常好。全面报道 - 没问题。问题是我在控制器集成测试期间无法使用此技术。它是一个更高层,完全隐藏模型。所以我想在这一点上注入模拟是不可能的。一方面这是正确的,因为它是集成测试的本质,另一方面,我对控制器测试的覆盖率非常低。
问题摘要:
我见过一个将所有实现为插件的解决方案。因此,某些命名空间重定向可以指向模拟插件。但我不认为这是一个很好的解决方案。
答案 0 :(得分:0)
修复可测试类的依赖项注入问题,添加以下函数或注入构造函数。
function setDependentProperty(Type $value)
{
$this->_dependency = $value;
return $this;
}
function getDependentProperty()
{
if (!isset($this->_dependency)) {
$this->_dependency = new DependencyType();
}
return $this->_dependency;
}
然后在测试中使用Mocks
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);
}
了解Unittests不是集成测试,应该是非常孤立的
http://www.typemock.com/unit-tests-integration-tests
了解没有“正确”的覆盖范围