zend-framework - 测试策略。 PHPUnit 在 zend 框架 Controller 集成/冒烟测试中进行模拟

标签 zend-framework tdd phpunit integration-testing

我有一个复杂的后端应用程序,使用 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

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

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

关于zend-framework - 测试策略。 PHPUnit 在 zend 框架 Controller 集成/冒烟测试中进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11540303/

相关文章:

php - 静态方法是邪恶的,那么 Laravel 怎么会使用这么多静态调用呢?

php - 如何使用 PHPUnit 在 Symfony2 中设置数据库密集型单元测试?

php - 如何在 Symfony 4 和 Simple-PHPUnit 中调试测试?

php - json_encode/json_decode 与 Zend_Json::encode/Zend_Json::decode

php - 将 Amazon S3 与 FineUploader 结合使用时出错

javascript - 在 zend 框架中的 View 中添加 js 和 css 文件

mysql - Zend 语法中的 Sql 查询

unit-testing - 自动化测试感觉很像复制被测试的逻辑,我做对了吗?

ruby-on-rails - 在 Rails Web 应用程序中进行简单单元测试的好方法是什么?

php - Laravel PHPUnit 模拟请求