是否可以在PhpUnit中的测试用例外创建一个模拟?

时间:2015-02-17 16:54:53

标签: php unit-testing mocking phpunit

看起来很愚蠢,希望不是,但我想创建一个服务,为那些使用我的项目的人返回模拟对象,这样他们就可以模拟我项目中的所有类并测试他们的代码。

我的想法是提供这种服务,以便可以在其他项目的测试用例中调用它,并为每个测试获得适当的模拟。

这可能吗?或者还有其他方法可以做到这一点。顺便说一句,由于项目的限制,我不能使用任何模拟库。

2 个答案:

答案 0 :(得分:8)

是的,有可能。在引擎盖下,getMock方法使用PHPUnit_Framework_MockObject_Generator类。所以你可以直接使用它:

PHPUnit_Framework_MockObject_Generator::getMock($originalClassName, $methods)

但是你会失去所有期望的捷径,例如$this->once()。您必须自己实例化期望:

$mock->expects(\PHPUnit_Framework_TestCase::once())

查看PHPUnit source code以了解模拟是如何构建的

答案 1 :(得分:2)

如果您在TestCase之外构建模拟,它将不会被视为模拟,并且它的期望不会被自动检查。

如果您的模拟构建器服务应该完全来自PHPUnit测试(即使这些测试不相关),您可以将测试用例实例传递给模拟构建器,这样您就可以通常的方式构建模拟:

class MockBuilderService
{
    private $test;

    public function __construct(PHPUnit_Framework_TestCase $test)
    {
        $this->test = $test;
    }

    public function buildVeryComplexMock()
    {
        $mock = $this->test->getMock('MyClass');
        $mock->expects($this->test->once())
             ->method('foo')
             ->willReturn(1);      
        return $mock;      
    }
}

所以你可以在测试中使用它:

class ATest extends PHPUnit_Framework_TestCase
{
    public function testFoo()
    {
        $mock_builder = new MockBuilderService($this);
        $complex_mock = $mock_builder->buildVeryComplexMock($mock_configuration);

       // the mock expectations will be checked as usual
    }

}