Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework 测试策略。zend框架控制器集成/烟雾测试中的PHPUnit模拟_Zend Framework_Tdd_Phpunit_Integration Testing - Fatal编程技术网

Zend framework 测试策略。zend框架控制器集成/烟雾测试中的PHPUnit模拟

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是不可能的。一方面,这是正确和好的,因为这是集成测试的本质,另一方面,我对控制器测试的覆盖率非常低 问

我有一个复杂的后端应用程序,使用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控制器测试()不允许您“直接”访问控制器。这是有意的!很好!你只会触发调度器。您无法访问较低的组件。只针对请求和响应。您应该将您的逻辑推到模型中,控制器中几乎没有要测试的内容。例如,所有依赖项和服务都应该通过模型访问。使用我上面提到的第一部分将依赖项注入到模型中。例如,我们甚至不在我的项目上测试我们的控制器。。。