Laravel 模拟未执行

Posted

技术标签:

【中文标题】Laravel 模拟未执行【英文标题】:Laravel mocking is not executing 【发布时间】:2020-06-10 13:09:31 【问题描述】:

我一直在尝试在 Laravel 6 单元测试中模拟服务类,但调用正在转移到真实方法而不是模拟响应。这是我要模拟的 People 类 -

class People
 
    public static function checkCredentials($username, $password) 
        // some code, which is not supposed to execute while unit testing. 
    

负责执行此操作的控制器是 -

class AuthController extends Controller 
    public function login(Request $request) 
        $auth = People::checkCredentials($request->username, $request->password);
        dd($auth);  // I am expecting mocked response here i.e., ['abc'].
    

这是我的测试课-

class LoginTest extends TestCase 
    /** @test */
    public function a_user_can_login() 
         $this->mock(People::class, function ($mock) 
            $mock->shouldReceive('checkCredentials')
                    ->withArgs(['username', 'password'])
                    ->once()
                    ->andReturn(['abc']);
        );
        $this->assertTrue(true);
    

控制器中的转储返回的是真实的响应,而不是模拟的。我需要帮助来了解我做错了什么。谢谢。

【问题讨论】:

【参考方案1】:

为了模拟服务,必须将服务作为服务容器注入。

目前您正在调用 People 类的静态方法,而没有实例化该类。

$auth = People::checkCredentials($request->username, $request->password);

尝试将类作为服务容器注入,以便 Laravel 可以捕获并模拟它。您可以将其键入提示作为函数的参数。

class AuthController extends Controller 
    public function login(Request $request, $people People) 
        $auth = $people::checkCredentials($request->username, $request->password);
        dd($auth);  // I am expecting mocked response here i.e., ['abc'].
    

Mocking objects

Service Container

【讨论】:

以上是关于Laravel 模拟未执行的主要内容,如果未能解决你的问题,请参考以下文章

记一次Laravel 定时任务schedul:run未执行的处理

是否可以使用 API 令牌在 laravel 中进行用户模拟?

未找到 Laravel“代客安装”

Laravel - ORM - 调用未定义的方法

Laravel 邮件队列未发布到邮件陷阱

laravel 自定义命令未列出