2017-10-17 164 views
0

我运行该脚本Laravel黄昏报告“常规错误:5数据库被锁定”和“操作超时”

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', '[email protected]') 
       ->type('password', 'password') 
       ->type('password_confirmation', 'password') 
       ->click('@dusk-accept') 
       ->click('@register-button') // 
       ->assertDontSee('The name field is required.'); 
     }); 

     $this->assertDatabaseHas('users', [ 
      'email' => '[email protected]', 
      'verified' => 0 
     ]); 
    } 


    /** @test */ 

    public function a_user_confirms_a_email_address() 
    { 
     $this->browse(function (Browser $browser) 
     { 
      $user = User::where('email', '[email protected]')->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' => '[email protected]', 
      'verified' => 1 
     ]); 
    } 

} 

,当它击中线

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

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

,但我得到了以下错误:

里面的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();。否则,在测试之后,连接将不会关闭。