【问题标题】:Laradock unit testing database errors PDOExceptionLaradock 单元测试数据库错误 PDOException
【发布时间】:2018-09-22 10:47:06
【问题描述】:

所以我正在尝试为这样的 Laravel 应用程序编写单元测试:

protected function setUp()
{
    parent::setUp();
    $this->disableMiddlewareForAllTests();
    $this->withoutExceptionHandling();
}

public function test_login_badRequest()
{
    $response = $this->call('post', '/login');
    $response->assertOk();
    $response->assertJson(['status' => 400]);
}

以上工作正常,并给出以下输出:

Test 'Tests\Unit\LoginTest::test_login_badRequest' started
Test 'Tests\Unit\LoginTest::test_login_badRequest' ended
Time: 69 ms, Memory: 12.00MB
OK (1 test, 2 assertions)

但下一个测试是另一回事:

public function test_login_goodRequest()
{
    $response = $this->call('post', '/login', [
        'email' => 'email@email.com',
        'password' => 'P4ssw0rd'
    ]);

    $response->assertOk();
    $response->assertJson(['status' => 200]);
}

一旦测试命中应用程序中的这行代码:

/* Retrieve User associated with posted email address */
$user = $this->userModel
    ->where('email', $request->post('email'))
    ->get();
die('here');// <-- Happens in browser, does not happen in tests.

这是错误:

1) Tests\Unit\LoginTest::test_login_goodRequest
PDOException: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
/var/www/html/projects/laravel-template/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:68 ...

几天来我一直在努力解决这个问题,知道这里发生了什么,以及如何让那个骰子在测试中打印出来? 干杯。

-- Laradock、Docker、nginx、mysql、 PHP 7.2.4-1+ubuntu16.04.1+deb.sury.org+1 (cli) (build: Apr 5 2018 08:53:57) (NTS) 版权所有 (c) 1997-2018 PHP 集团 Zend Engine v3.2.0,版权所有 (c) 1998-2018 Zend Technologies 使用 Zend OPcache v7.2.4-1+ubuntu16.04.1+deb.sury.org+1,版权所有 (c) 1999-2018,由 Zend Technologies 提供

已编辑:

.env:

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:Z+p6uA3G2DyCCFBXOPgrWwls1U6z/vi8Zi2r4eKHxEY=
APP_DEBUG=true
DEBUGBAR_ENABLED=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sample_database
DB_USERNAME=root
DB_PASSWORD=root

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

【问题讨论】:

  • 请发布您的docker-compose.yml.env
  • @alex docker-compose.yml 是 900 行代码,您对哪一部分感兴趣,我会粘贴。
  • 只要确保.env 中的DB_HOST 与mysql 容器名称相同即可。他们没有在原来的docker-compose.yml 中指定container_name,因此docker 可以将您的容器命名为application_mysql 或其他名称。如果您运行docker ps,您将看到容器名称。另外,请确保 PHPUnit 在连接时使用相同的 mysql 容器名称,如果它不采用来自 .env 的值。
  • 我 95% 确定这是问题所在。如果它真的对你有帮助,我会把它作为答案发布。
  • 好吧,docker ps 说:容器 ID、图像、命令、创建、状态、端口、名称:f10f6deb314a、laradock_mysql、“docker-entrypoint.s…”,2 周前,最多 2 小时, 0.0.0.0:3306->3306/tcp, laradock_mysql_1

标签: php mysql unit-testing docker laradock


【解决方案1】:

在聊天中,我们发现您正在从您的主机运行测试。可以从主机运行测试,但您必须将端口公开给主机。我认为 laradock 会这样做,但我不确定你是否在你的设置中有它(github 版本有)。 虽然,它是一个 docker 反模式。

容器旨在包含它们之间的所有通信,并且您应该只在 updown 进行主机通信。

因此,最好的解决方案是使用docker exec -it workspace bashdocker-compose exec workspace bash 进入您的workspace 容器并从那里运行测试。

【讨论】:

  • 我现在已经启动并运行测试(从工作区容器内部)。非常感谢!
猜你喜欢
  • 2018-07-26
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多