【问题标题】:Unable to mock any custom class method in laravel 6无法在 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());

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

【问题讨论】:

    标签: php laravel phpunit laravel-6 mockery


    【解决方案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
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多