【问题标题】:Use Mockery to mock a static method called in another static method使用 Mockery 模拟在另一个静态方法中调用的静态方法
【发布时间】:2016-06-24 23:18:29
【问题描述】:

我想用 Mokcery 模拟一个已经在另一个方法中使用过的静态方法,如下:

Class SomeClass
{
   public static function methodA()
   {
     .....;
     self::B();
   } 
   public static function methodB()
   {
     Do SomeThing
   }
}

如果我想mock methodB,并使用methodA,mock函数不起作用,因为methodB用在methodA中,如下

 use Mockery as m;
   $mocktest = m::mock->('SomeClass[B]');
   $mocktest->shouldReceive('B')->andReturn("expectedResult");
   $mocktest->methodA();

上面的代码将导致methodB仍然返回它的原始结果而不是'expectedResult'。 我希望methodA中使用的methodB被嘲笑,我该如何操作?

【问题讨论】:

    标签: php testing phpunit mockery


    【解决方案1】:

    您需要使用别名来模拟静态方法:

    $mock = \Mockery::mock('alias:SomeClass');
    

    请注意,类还不能加载。否则嘲讽将无法为它起别名。

    文档中的更多内容:

    请注意,模拟静态方法不是一个好主意。如果你觉得你需要它,那么你的设计就有问题。 嘲笑你正在测试的班级更糟糕,这表明你的班级有太多的责任。

    【讨论】:

    • 感谢您的帮助。但我现在要做的是模拟一个已在另一个静态方法中调用的静态方法,而不仅仅是模拟一个简单的静态方法。
    • 在我的例子中,为了使测试成为可能,我围绕 Laravel 作业调度调用创建了一个非静态包装器函数(然后包装器是可模拟的):public function dispatchCustomMailableJob($contactId, $executeAt, $customMailable) { SendEmailJob::dispatch($contactId, $executeAt, $customMailable); }
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2022-11-18
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多