mockery重载类缺少方法

时间:2017-02-10 11:23:51

标签: php unit-testing testing phpunit mockery

需要使用Mockery的一些帮助 - 我想重载一个类,它是在方法中使用new HelperUtil()创建的。

使用Mockery overload我可以这样做,但它留给我一个空的shell类。然后,我似乎必须创建所有被调用的方法。有没有办法创建一个重载的完整模拟,然后只更改一个方法?

    $mock = \Mockery::mock('overload:'.HelperUtil::class);
    $mock->shouldReceive('content')->andReturnUsing(function() {
        return 'different content';
    });

感谢

编辑: 我想我想这样做:

    $mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldDeferMissing();
    $mock->shouldReceive('content')->andReturnUsing(function() {
        return 'different content';
    });

但是仍然没有工作=(

1 个答案:

答案 0 :(得分:3)

GitHub上有一个interesting discussion

  

shouldIgnoreMissingshouldDeferMissing(和其他此类标志   现在和将来)工作,但不是在模拟,而是在实例上   模拟。

     

听起来令人困惑,但这是因为内部原因。

     

当您执行m::mock('overload:Foo');嘲弄时,会创建一个新的   基于Foo“模板”的名为Mock.php的课程。那个模板   默认情况下将_mockery_ignoreMissing标志设置为false。

     

一旦mock方法结束,它就会创建一个重载的Foo   对象并将其返回给我们。重载的Foo类也是   可用于实例化新的Foo个对象。

     

调用$m->shouldIgnoreMissing()会在上面设置忽略缺失标志   模拟方法返回的对象。

     

调用new Foo()会创建一个Foo对象的新实例   Mock.php的{​​{1}}模板默认为false。

     

如果要在新实例上将标志设置为true,则需要调用   该实例上的_mockery_ignoreMissing,而不是shouldIgnoreMissing()

正如我所看到的,功能“should ignore missing on instance mocks”已经完成,所以你能做的最好就是

$m

我认为$mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldIgnoreMissing(); 尚未完成shouldDeferMissing

当然,作为一种解决方法,您可以考虑创建一个模拟并注入它。