2017-02-01 22 views
4

根據to the "Database Testing" documentation我可以在每次測試後重置數據庫(第一個選項)。第二個選項是使用事務運行測試。這對我來說似乎是一個更好的方法,但如果我想用事務運行,遷移不會運行。用Laravel黃昏遷移一次

有沒有什麼辦法可以爲運行一次遷移所有的測試過程?

換句話說,我想運行遷移,用事務運行每個測試,然後回滾。我嘗試了文檔所說的內容,但我認爲缺少一些東西。

回答

2

今天有一段時間與此糾纏在一起,並與遷移一起運行遷移似乎有訣竅。我測試的快照如下:

<?php 

namespace Tests\Browser; 

use App\User; 
use Tests\DuskTestCase; 

use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 

class DefaultTest extends DuskTestCase 
{ 
    use DatabaseMigrations, DatabaseTransactions; 

    /** 
    * A Dusk test example. 
    * 
    * @return void 
    */ 
    public function test_something() 
    { 
     //Add test stuff here 
    } 
} 

我有一對夫婦的工廠在我的實際測試,他們似乎通過與試驗破壞後的數據遷移按預期運行。

+0

這只是運行數據庫遷移。黃昏時不支持事務,因爲它在瀏覽器中運行。 – Christophvh

+0

好的解決方案的人!真的:) –

1

目前無法與黃昏結合運行DatabaseTransactions。

https://github.com/laravel/dusk/issues/110

用戶記錄的創建,並在瀏覽器中使用它是 在兩個不同的過程來完成。這意味着創建的用戶是數據庫事務的一部分 ,該數據庫事務沒有被提交,因此瀏覽器進程不能訪問 。

數據庫遷移工作。所以你應該使用這些。還要確保你運行一個獨立的測試數據庫,以免混淆你的生產/開發數據庫。

https://laravel.com/docs/5.4/dusk#environment-handling

要強制黃昏運行測試時使用它自己的環境文件, 在項目的根目錄中創建一個.env.dusk。{}環境文件。 例如,如果您將從您的 本地環境啓動黃昏命令,則應創建一個.env.dusk.local文件。

運行測試時,Dusk將備份您的.env文件並將您的黃昏環境重命名爲.env。一旦測試完成,您的.env 文件將被恢復。

由於DatabaseMigrations的工作原因,提供的答案有效。 use DatabaseTransactions不相關。

0

從我所瞭解的情況來看,我不認爲使用黃昏時交易可以工作,因爲黃昏中的每個瀏覽器請求都會創建一個單獨的laravel應用程序實例。

以前,phpunit會在內存中創建一個新的應用程序(在setUp/方法中),然後測試該測試應用程序,然後將其銷燬並設置下一個應用程序。因此,在爲下一次測試啓動新的數據庫連接之前,可以將事務打包(或剛好在內部)創建和銷燬該應用程序的某些部分。使用黃昏時,它是真正的端到端測試(包括瀏覽器,僞造的用戶交互,本地機器上的路由選擇等),這意味着它不是全部包含在運行測試的環境中像他們通常在phpunit中一樣。

黃昏執行以下操作:

  • 複製你.env.dusk.*並啓動chromedriver(或任何硒像你使用的東西)
  • 觸發PHPUnit的shell命令(即新的命令,新工藝。)
  • phpunit命令運行你的黃昏測試,每個測試打開一個瀏覽器窗口併發出請求(每個請求開始一個新的php-fpm和php進程(對於nginx)) - 就像你自己發出這些請求一樣。他們每個人都有單獨的連接到數據庫,所以不能與其他人的交易進行交互。

另外值得一提的是,DatabaseTransactions特點是在基礎包,而不是黃昏包,所以它不是建/在考慮黃昏包裝。

這也解釋了爲什麼內存中的sqlite不能與黃昏一起工作,因爲一個進程無法訪問另一個進程的內存。