Laravel 黄昏报“General error: 5 database is locked”和“Operation timed out”

Posted

技术标签:

【中文标题】Laravel 黄昏报“General error: 5 database is locked”和“Operation timed out”【英文标题】:Laravel dusk reports "General error: 5 database is locked" and "Operation timed out" 【发布时间】:2018-03-29 05:43:25 【问题描述】:

我正在运行脚本

namespace Tests\Browser;

use App\User;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\RefreshDatabase;

class RegistrationTest extends DuskTestCase


    use RefreshDatabase;

    /** @test */

    public function a_user_registers_for_an_account()
    
        $this->browse(function (Browser $browser)
        
            $browser->visit(route('app-registration-create'))
                ->type('name', 'John')
                ->type('lastName', 'Doe')
                ->type('email', 'john.doe@ps.com')
                ->type('password', 'password')
                ->type('password_confirmation', 'password')
                ->click('@dusk-accept')
                ->click('@register-button') //
                ->assertDontSee('The name field is required.');
        );

        $this->assertDatabaseHas('users', [
            'email' => 'john.doe@ps.com',
            'verified' => 0
        ]);
    


    /** @test */

    public function a_user_confirms_a_email_address()
    
        $this->browse(function (Browser $browser)
        
            $user = User::where('email', 'john.doe@ps.com')->first();

            var_dump(route('app-registration-confirm-email', ['token' => $user->token])); // "http://ps.dev/app/registration/confirm/aPAWN1QlGyl8Id2vXIJU9Fn8G6bsef"

            $browser->visit(route('app-registration-confirm-email', ['token' => $user->token]));

        );

        $this->assertDatabaseHas('users', [
            'email' => 'john.doe@ps.com',
            'verified' => 1
        ]);
    


当它击中线时

$browser->visit(route('app-registration-confirm-email', ['token' => $user->token]));

它停止工作。该步骤背后的想法是验证用户是否提供了有效的电子邮件地址。因此,应用程序将从 URL 中获取令牌并检查数据库中是否存在具有该令牌的用户。如果是这样,请将已验证的属性设置为 1,并将令牌设置为 null。

但我收到以下错误:

在 laravel.log 文件中我可以看到:

[2017-10-17 13:24:30] testing.ERROR: SQLSTATE[HY000]: General error: 5 
database is locked (SQL: update "users" set "verified" = 1, "token" = , 
"updated_at" = 2017-10-17 13:23:30 where "id" = 1)

在终端上我可以看到:

There was 1 error:

1) Tests\Browser\RegistrationTest::a_user_confirms_a_email_address
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http GET to /session/856dbb7e7769ec0a369e44e13b6b676d/screenshot

Operation timed out after 30000 milliseconds with 0 bytes received

/home/vagrant/ps/vendor/facebook/webdriver/lib/Remote/HttpCommandExecutor.php:286
/home/vagrant/ps/vendor/facebook/webdriver/lib/Remote/RemoteWebDriver.php:535
/home/vagrant/ps/vendor/facebook/webdriver/lib/Remote/RemoteWebDriver.php:333
/home/vagrant/ps/vendor/laravel/dusk/src/Browser.php:244
/home/vagrant/ps/vendor/laravel/dusk/src/TestCase.php:160
/home/vagrant/ps/vendor/laravel/framework/src/Illuminate/Support/Collection.php:341
/home/vagrant/ps/vendor/laravel/dusk/src/TestCase.php:161
/home/vagrant/ps/vendor/laravel/dusk/src/TestCase.php:94
/home/vagrant/ps/tests/Browser/RegistrationTest.php:51

也许我没有正确应用黄昏,但我在网上找不到解决方案。

【问题讨论】:

【参考方案1】:

这是一个已经有点老的问题,但我自己找到了解决这个问题的方法。 问题是测试之间的连接没有关闭。如果我一次只调用 1 个,但运行一批测试会引发数据库锁定错误,我的测试会起作用。

解决方案是我在自己的拆解函数中缺少parent::tearDown();。这意味着连接不会在测试之间关闭。

对于所提出的问题,DuskTestCase 中很可能有一个 tearDown 函数,或者在另一个没有 parent::tearDown(); 的测试中。看看这个,你应该可以在某个地方找到问题。

TLDR:检查您的 tearDown 函数并确保它们包含 parent::tearDown();。否则测试后连接不会关闭。

【讨论】:

谢谢伙计。你刚刚把我从调试的日子里救了出来。不知道我怎么在我的代码中错过了这个。【参考方案2】:

就我而言,我正在使用这行代码

Artisan::call('migrate');

在我的 setUp() 方法中,下面在我的 tearDown() 方法中

Artisan::call('migrate:rollback');
parent::tearDown();

我不得不将它们注释掉。显然数据库连接在测试之间没有关闭,RefreshDatabase trait 已经解决了这个问题。

【讨论】:

以上是关于Laravel 黄昏报“General error: 5 database is locked”和“Operation timed out”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 黄昏没有看到 vuejs 选择器

如何解决 SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table in laravel?

Laravel 5.4 phpunit 与黄昏测试 Env App_Url

SQLSTATE[HY000]: General error: 1114 The table '/home/mysql/data3007/tmp/#sq

corresponding SQLSTATE values general error

解决SQLSTATE[HY000]: General error: 2006 MySQL server has gone away问题的方法