3

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

问题总结:

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

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

4

1 回答 1

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);
}

了解单元测试不是集成测试,应该非常孤立

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

了解没有“正确”的保险金额

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

于 2012-07-18T18:36:26.610 回答