Codeception\Util\Stub方法:: exact和:: once不起作用

vat*_*vit 10 php unit-testing stub codeception

我正在使用Codeception\Util\Stub来创建单元测试.我想确保我的方法多次调用.为此,我正在使用'确切'的方法.

例:

use \UnitTester;
use \Codeception\Util\Stub as StubUtil;

class someCest
{
    public function testMyTest(UnitTester $I)
    {
        $stub = StubUtil::makeEmpty('myClass', [
            'myMethod' => StubUtil::exactly(2, function () { return 'returnValue'; })
        ]);
        $stub->myMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

如你所见,我给myMethod打过一次电话.但测试通过了.与method :: once相同的问题,因为此方法使用相同的类PHPUnit_Framework_MockObject_Matcher_InvokedCount(下面的'matcher').只有当我打电话超过预期时间(> 2)时,测试才会失败.因为matcher的方法'invoked'检查计数是否超出预期.但是看不出是否有人调用matcher的方法'verify'来检查myMethod是否调用的次数少于预期.

抱歉stackoverflow,这是我的第一个问题.

UPDATE

我的快速和BAD临时解决方案:

将存根添加到帮助器中

$I->addStubToVerify($stub);
Run Code Online (Sandbox Code Playgroud)

将方法添加到帮助程序以验证:

protected $stubsToVerify = [];
public function verifyStubs()
{
    foreach ($this->stubsToVerify as $stub) {
        $stub->__phpunit_getInvocationMocker()->verify();
    }
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

在Cest的方法_after()中调用此方法:

public function _after(UnitTester $I)
{
    $I->verifyStubs();
}
Run Code Online (Sandbox Code Playgroud)

小智 6

您需要将$this第三个参数传递给makeEmpty:

$stub = StubUtil::makeEmpty('myClass', [
    'myMethod' => StubUtil::exactly(2, function () { return 'returnValue'; })
], $this);
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案不起作用.method :: make()和:: makeEmpty()将第三个参数作为PHPUnit_Framework_TestCase,但是$ this is someCest并且不扩展PHPUnit_Framework_TestCase. (3认同)