Codeception \ Util \ Stub方法::完全和::一旦不起作用

时间:2014-10-01 11:26:37

标签: 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();
    }
}

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

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

更新

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

将存根添加到帮助程序

$I->addStubToVerify($stub);

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

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

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

public function _after(UnitTester $I)
{
    $I->verifyStubs();
}

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

将单元测试修改为\Codeception\Util\Stub,然后使用Expected::once()extends \Codeception\Test\Unit来创建存根,而不是使用$this->make()$this->makeEmpty()。它将按您期望的那样工作;)

例如:

class MyProcessorTest extends \Codeception\Test\Unit 
{
    public function testSomething()
    {
        $processor = new MyProcessor(
            $this->makeEmpty(EntityManagerInterface::class, [
                'remove' => Expected::never(),
                'persist' => Expected::once(),
                'flush' => Expected::once(),
            ])
        );

        $something = $this->somethingFactory(Processor::OPERATION_CREATE);
        $processor->process($something);
    }
}

干杯!

答案 2 :(得分:0)

您所模拟的目标类中似乎不存在您的方法。

如果该方法存在,则Codeception将其替换为您提供的存根。如果此方法不存在,则Codeception将具有此名称的字段添加到存根对象。

这是因为方法和属性在同一数组中传递,所以Codeception没有其他方法可以从属性中区分方法。

因此,首先在类myClass中创建方法myMethod。