laravel 测试中认证失败

Posted

技术标签:

【中文标题】laravel 测试中认证失败【英文标题】:Authentication failed in laravel test 【发布时间】:2021-07-12 23:38:05 【问题描述】:

我正在尝试编写测试,但我无法通过假测试用户进行身份验证,我正在使用 mongodbjenssegers/laravel-mongodbjwt-auth

这是我创建的工厂

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(\App\User::class, function (Faker $faker) 
    return [
        'username' => $faker->name(),
        'password' => $faker->password()
       
    ];
);

phpunit.xml 文件

<php>
  <server name="APP_ENV" value="testing"/>
  <server name="BCRYPT_ROUNDS" value="4"/>
  <server name="CACHE_DRIVER" value="array"/>
  <server name="DB_CONNECTION" value="mongodb"/>
  <server name="DB_DATABASE" value=":memory:"/>
  <server name="MAIL_DRIVER" value="array"/>
  <server name="QUEUE_CONNECTION" value="sync"/>
  <server name="SESSION_DRIVER" value="array"/>
</php>

这是测试

p

ublic function test_if_can_customer()
        $this->withoutExceptionHandling();
        $user = User::factory()->make();

        $url = '/customer/12345646';
        $response = $this->actingAs($user,'api')
                         ->json('GET', $url);
    
        $response
            ->assertStatus(200)
            ->assertJson([
                'meta'=>[
                    'success'=>true
            ]
       ]);

我得到这个错误:

1) Tests\Feature\LeadTest::test_if_can_get_customer
MongoDB\Driver\Exception\AuthenticationException: Authentication failed.
 

更新:

如果我使用 sqlite 而不是 mongodb

<php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>

我收到此错误:

TypeError: Argument 1 passed to Jenssegers\Mongodb\Query\Builder::__construct() must be an instance of Jenssegers\Mongodb\Connection, instance of Illuminate\Database\SQLiteConnection given, called in /home/myuser/myproject/vendor/jenssegers/mongodb/src/Jenssegers/Mongodb/Eloquent/Model.php on line 415

【问题讨论】:

对于基因检测,您应该使用 SQLite 连接。如果您想实际与 Mongo 驱动程序交互,您可以创建一个单独的数据库并在 phpunit.xml 中指定它 您的测试从未运行,因为与数据库的连接失败。 (MongoDB 需要用户名和密码,但您没有在 phpunit.xml 中指定)。我同意上面的评论,你应该在你的 phpunit.xml 中使用 SQLite 而不是 mongoDB 进行测试,那么你不需要用户名/密码。 【参考方案1】:

您的工厂和测试代码永远不会运行,因为与测试数据库的连接失败。它失败了,因为 MongoDB 需要用户名和密码,但您没有在 phpunit.xml 中指定它。

但是,就像 Kenny Horna 在上面的评论中所说的那样,您应该使用 SQLite 而不是 mongoDB 进行测试。

在您的phpunit.xml 中,将您的DB_CONNECTION 更改为sqlite

  <server name="DB_CONNECTION" value="sqlite"/>

【讨论】:

我得到一个错误我使用sqlite我已经更新了问题 您的包裹 Jenssegers\Mongodb 似乎有问题。您是否使用您的凭据正确配置了 config/database.php.env 文件? 我认为它是正确的,因为应用程序可以工作,这个问题是唯一使用 sqlite 进行大量测试的问题 问题是您的测试设置没有正确配置。它在没有正确凭据的情况下调用Jenssegers\Mongodb。相反,它应该调用 SQLite。检查你的配置文件。

以上是关于laravel 测试中认证失败的主要内容,如果未能解决你的问题,请参考以下文章

当摘要认证开启时,Gatling 测试失败

kali与SUSE Linux 配置SSH认证失败次数和锁定时间

中心网络连接失败,认证地址

如何修复 Windows App 认证工具包平台版本启动失败

贝宝快递结账服务器端,认证失败

SANGFOR防火墙配置上网认证,LDAP自动同步失败