如何模拟接口方法以使用闭包返回参数值

时间:2019-08-26 18:07:46

标签: phpunit closures phpunit-testing

有时候,我们需要模拟接口的某些方法以使其工作,而我们并不真正在意它会返回什么,我们只需要确保它被调用即可。

有一种设置方法

->expects(static::once())->method('someMethod')->willReturn('dumbValue');

但是通常需要在测试中查看调用了哪个参数,然后我们需要使用

->expects(static::once())->method('someMethod')->with(static::equalTo('paramvalue'))->willReturn('dumbValue');

它变得越来越长。

是否有一种方法可以返回给willReturn()方法中模拟的函数提供的参数值? 然后,使用数据提供程序测试输出是如此简单

1 个答案:

答案 0 :(得分:0)

我们可以使用闭包来处理回调。

    $this->translator                   = $this->createMock(TranslatorInterface::class);
    $this->translator->method('translate')->will(
        $this->returnCallback(
            function ($msgid) {
                return (string)$msgid;
            }
        )
    );

此外,我们不仅可以返回参数值,还可以返回之前生成的任何变量值:

        $variable = 'hello'
        $this->returnCallback(
            function ($msgid) use $variable {
                return $msgid . $variable;
            }
        )

和断言看起来像:

    static::assertEquals(
        'key',
        $this->translator->translate('key');
    );


    static::assertEquals(
        'some text and translated '. 'key',
        'some text and translated ' . $this->translator->translate('key');
    );