jsiefer/class-mocker

可以模拟整个框架或命名空间

0.3.4 2016-12-20 21:50 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:53:03 UTC


README

[构建状态] (https://travis-ci.org/jsiefer/class-mocker) [覆盖率状态] (https://coveralls.io/github/jsiefer/class-mocker?branch=master)

简介

一个简单的辅助库,允许您模拟整个框架或命名空间。这对于编写不支持单元测试的库的扩展或插件的单元测试很有帮助。

想法是自动模拟整个命名空间。类将在需要时即时生成。

如果需要,您可以注册特性以向某些类添加特殊功能。

或者,您可以创建一个类足迹参考文件,其中包含类层次结构、接口或常量等信息。

示例

一个简单的例子,假设您正在编写一个框架的插件或扩展,该框架不支持单元测试,但它要求您从难以模拟(不初始化整个框架)的类扩展。

/**
 * My awesome sample plugin
 */
class MyPlugin extends Example_Namespace_AbstractPlugin
{
    /**
     * Return full name
     *
     * @return string
     */
    public function getName()
    {
        if (!$this->_isLoaded) {
            throw new Exception("Not yet loaded");
        }
        $firstname = $this->getFirstname();
        $lastname = $this->getLastname();

        return $firstname . ' ' . $lastname;
    }
}

现在假设为了测试上述方法,您需要初始化整个框架,这可能需要几秒钟,从而违背了快速单元测试的目的。

class-mocker 库允许您生成任何与模式匹配的缺失类(例如 Example_Namespace_*),然后为您即时生成。

所有生成的类也将实现 PHPUnit_Framework_MockObject_MockObject 接口,并为您提供访问 expects()method() 方法以进行测试的能力。

要启用 class-mocker,您需要为您的 PHPUnit 测试项目创建一个自定义引导文件,并定义您想要即时生成的类。

<?php
/**
 * Sample PHPUnit bootstrap.php
 */
include 'vendor/autoload.php';

$classMocker = new \JSiefer\ClassMocker\ClassMocker();
//$classMocker->mock('Example\Namespace\*');
$classMocker->mock('Example_Namespace_*');
$classMocker->enable();

这就完成了,现在一旦启用,您就可以简单地测试您的类,而无需要求任何原始框架类。

/**
 * Class MyPluginTest
 */
class MyPluginTest extends PHPUnit_Framework_TestCase
{
    /**
     * Test the getName method
     *
     * @return void
     * @test
     */
    public function testGetName()
    {
        /** @var MyPlugin|PHPUnit_Framework_MockObject_MockObject $myPlugin */
        $myPlugin = new MyPlugin();
        $myPlugin->_isLoaded = true;
        $myPlugin->expects($this->once())->method('getFirstname')->willReturn('John');
        $myPlugin->expects($this->once())->method('getLastname')->willReturn('Snow');

        $this->assertEquals(
            'John Snow',
            $myPlugin->getName(),
            'getName() Plugin did not return correct full name'
        );
    }

    /**
     * Should throw exception if object is not loaded
     *
     * @test
     * @expectedException Exception
     * @expectedExceptionMessage Not yet loaded
     */
    public function shouldFailGetNameIfNotLoaded()
    {
        /** @var MyPlugin|PHPUnit_Framework_MockObject_MockObject $myPlugin */
        $myPlugin = new MyPlugin();
        $myPlugin->_isLoaded = false;

        // should throw Exception
        $myPlugin->getName();
    }
}

高级

当您想要模拟框架时,还有很多其他的东西,例如类层次结构、类常量和一些基本类。

模拟许多类时,重要的是整个 PHPUnit 测试需要同意相同的实现。

您可以定义类足迹并包含 JSON 类足迹参考文件以克隆整个类树。

理想情况下,您不直接使用此库,而是创建一个框架模拟库,该库提供所有必需的类引用和常量等,并在项目中使用该库进行测试。

此项目最初创建是为了模拟 Magento 进行单元测试。查看 mock-mage 库,该库使用此库来模拟整个 Magento 框架/应用程序。