Laravel phpunit 测试需要访问 API 服务进行用户验证

Posted

技术标签:

【中文标题】Laravel phpunit 测试需要访问 API 服务进行用户验证【英文标题】:Laravel phpunit testing needs access to API Service for user validation 【发布时间】:2021-03-23 04:01:34 【问题描述】:

我正在开发一个 Laravel 项目,该项目正在访问用于所有后端数据存储的 API。这包括用户身份验证。

我有一个 API 服务以及一个 API 服务提供者,它证实了该服务,然后将该服务提供给带有请求变量的所有页面。

我认为在测试类中证实 API 服务更容易,这就是我正在做的事情,但我遇到了会话问题。

这是我目前所拥有的:

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use App\Services\ApiService;

class LoginTest extends TestCase

    private $apiService;

    public function __construct()
        $this->withSession(['user' => '', 'auth_token' => '']);
        $url = env('API_URL');
        $this->$apiService = new ApiService($url);
    

我收到此错误: 在 null 上调用成员函数 isStarted()。

有没有更好的方法来调用依赖会话变量进行测试的 API 服务?

【问题讨论】:

【参考方案1】:

我们最终是如何做到的:

我们将构造函数更改为 parent::SetUp 以调用 API 服务

public function setUp(): void
    
        parent::setUp();
        
        $url = env('API_URL');
        $this->ApiService = new ApiService($url);
    

然后在测试/TestCase 中,我们调用了登录后路由,传递了硬编码的测试用户名和密码信息。

public function login()
    
        $this->post("/login", ['email' => 'admin@big-api.test', 'password' => 'ThisUserWillBeDeleted']);
    

现在我只需在我需要通过 API 登录才能访问页面的每个测试用例中调用登录函数。

这最终比我想象的要简单得多,但花了一些时间才到达那里。希望这对其他人有帮助。

【讨论】:

以上是关于Laravel phpunit 测试需要访问 API 服务进行用户验证的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Laravel 中的 PHPUnit 不能访问存在的路由?

仅当访问 Laravel 5 中的根页面( visit('/') )时,PHPUnit 测试才会失败

如何在 laravel 5.5 中使用 phpunit 测试中间件?

phpunit 测试资源 laravel 5.5 返回集合而不是 json

Laravel 5.3 - 避免在 phpunit 测试中发送松弛通知

如何在 Laravel PHPUnit 测试中获取响应变量?