无法在 laravel 6 中模拟任何自定义类方法

Posted

技术标签:

【中文标题】无法在 laravel 6 中模拟任何自定义类方法【英文标题】:Unable to mock any custom class method in laravel 6 【发布时间】:2021-01-01 19:58:00 【问题描述】:

我有一个基本类助手。

namespace App\Helpers;

class CommonUtility 

    public static function foo() 
        return 'foo';
    

在User.php中使用

<?php
class User extends Authenticatable
    public function test() 
        return CommonUtility::foo();
    

现在我想用模拟 CommonUtility 类编写一个测试。谁能知道我是 laravel 单元测试的新手。

尝试了一些解决方案,例如

$mock = Mockery::mock(CommonUtility::class, function ($mock) 
            $mock->shouldReceive('foo')->andReturn('foobar');
        )->makePartial();

dd($mock->foo());

它给了我模拟结果,但我尝试过

$user = new \App\User();
dd($user->test());

它调用的是实际函数而不是模拟函数。

【问题讨论】:

【参考方案1】:

您可以为Mocking Public Static Methods 使用Aliasing Mockery 功能

例如:

        $mock = \Mockery::mock('alias:App\Helpers\CommonUtility');
        $mock->shouldReceive('foo')
            ->andReturn('foobar');
        
        $user = new User();
        $this->assertEquals("foobar", $user->test());

测试按预期通过

【讨论】:

别名仅在单独运行测试时有效。当运行整个测试套件时,它会因为类已经存在而失败。 别名工作我唯一需要添加的是code /** * @runInSeparateProcess * @preserveGlobalState disabled */ code 在测试之前 酷!感谢分享@JitenderThakur

以上是关于无法在 laravel 6 中模拟任何自定义类方法的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.6 laravel 接口 接管 自定义异常类

如何在 iOS 6 模拟器中自定义运营商名称?

在控制器中的自定义类上调用 0 次嘲弄模拟和间谍

我在哪里把我的自定义类和函数放在 Laravel 中

如何在 laravel 库中添加自定义方法

如何在没有虚方法的情况下创建派生类的基类?