测试策略。 PHPUnit在zend框架控制器集成/冒烟测试中进行模拟

时间:2012-07-18 11:30:18

标签: zend-framework tdd phpunit integration-testing

我有一个复杂的后端应用程序,使用zf 1.11.11和phpunit 3.5.15。该应用程序有一些复杂的通信组件(肥皂,休息等)。在CIS或开发测试环境中,我必须模拟这些模型,因为我无法与高效的第三方后端建立连接或请求。因此,通过模拟单元测试层的工作非常好。全面报道 - 没问题。问题是我在控制器集成测试期间无法使用此技术。它是一个更高层,完全隐藏模型。所以我想在这一点上注入模拟是不可能的。一方面这是正确的,因为它是集成测试的本质,另一方面,我对控制器测试的覆盖率非常低。

问题摘要:

  • 我无法创建与组件通信的测试服务(高成本)
  • 我无法在控制器测试期间注入组件模拟(我只设置请求数据并触发调度程序)
  • 我对控制器的报道很低

我见过一个将所有实现为插件的解决方案。因此,某些命名空间重定向可以指向模拟插件。但我不认为这是一个很好的解决方案。

1 个答案:

答案 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

了解没有“正确”的覆盖范围

  

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