Laravel 模拟未执行

Laravel mocking is not executing

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

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 -

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);
    }
}

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

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

目前您正在调用 People class 的静态方法,而没有 class.

的实例化

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

尝试将 class 作为服务容器注入,这样 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