【问题标题】:How to get full control of MockObject's behavior?如何完全控制 MockObject 的行为?
【发布时间】:2019-09-17 18:12:41
【问题描述】:

我需要创建一个 PHPUnit 测试替身:

  • 使用某些方法的原始实现
  • 为原始实现代理了一些其他方法,但允许我监视它们
  • 用具有固定返回值的 NOP 存根替换其他方法,并且调用原始实现

我该怎么做?

->getMockBuilder()->getMock()->createMock()->createPartialMock()->createTestProxy()->getMockBuilder()->enableProxyingToOriginalMethods()->setProxyTarget()之间,我似乎最多可以满足上述三个要求中的两个,但不能全部满足。

【问题讨论】:

  • 也许你需要根据你的测试创建不同的模拟

标签: phpunit


【解决方案1】:

通过模拟链接解决:

    protected function getMixedMock(
        string $className,
        array $constructorArgs,
        array $stubMethods,
        array $proxyMethods
    ) : array
    {
        $stub = $this->getMockBuilder($className)
            ->setMethods($stubMethods)
            ->getMock();

        $proxy = $this->getMockBuilder(Local::class)
            ->setConstructorArgs($constructorArgs)
            ->setMethods(array_unique(array_merge($stubMethods, $proxyMethods)))
            ->enableProxyingToOriginalMethods()
            ->setProxyTarget($stub)             // <-- CHAINING HERE
            ->getMock();

        return [$stub, $proxy];
    }

    public function test()
    {
        [$stub, $proxy] = $this->getMixedMock(
            LocalFSAdapter::class,
            ["/"],
            ['write'],
            ['has']
        );
        //methods that must be stubbed should be spied on using $stub
        //methods that must be proxied should be spied on using $proxy
        //use $proxy for testing
    }

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 2012-08-19
    • 2019-04-21
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多