Ошибки базы данных модульного тестирования Laradock PDOException - PullRequest
0 голосов
/ 22 сентября 2018

Итак, я пытаюсь написать модульные тесты для приложения 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 ...

Несколько дней я бился головой об этом, есть идеи, что здесь происходит, и как заставить этот кристалл печатать в тестах?Приветствия.

- Ларадок, Докер, nginx, mysql, PHP 7.2.4-1 + ubuntu16.04.1 + deb.sury.org + 1 (cli) (построен: 5 апреля 2018 08:53:57) (NTS) Copyright (c) 1997-2018 PHP Group Zend Engine v3.2.0, Авторские права (c) Zend Technologies 1998-2018 с 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}"

1 Ответ

0 голосов
/ 22 сентября 2018

В чате мы узнали, что вы запускали тесты с вашего хоста.Можно запускать тесты с хоста, хотя вы должны выставить порты хосту.Я думаю, что это делает Ларадок, хотя я не уверен, было ли это у вас в настройках (в версии github).Хотя это анти-шаблон Docker.

Контейнеры предназначены для хранения всей связи между ними и хостом, которые вы должны выполнять только up и down.

Следовательно,Лучшее решение - ввести ваш workspace контейнер с docker exec -it workspace bash или docker-compose exec workspace bash и запустить тесты оттуда.

...