簡體   English   中英

在laravel包中設置集成測試

[英]Setting up Integration tests in a laravel package

目前正努力在我正在編寫的包中設置集成測試。

對於集成測試,我需要訪問Laravel環境,以便我可以訪問諸如Artisan :: call('migrate')之類的東西並訪問數據庫。

目前我猜我需要進行任何測試擴展Laravel TestCase類,引導Laravel環境。 雖然我無法鍛煉如何將這個文件調用到我的包中。

其次,在工作台中開發包時,我需要使用Artisan :: call('migrate',' - bench =“vendor / package”')或Artisan :: call('migrate',' - package =“vendor /包“')這令人困惑。

我們需要創建一個Laravel實例,以及PHPUnit可以訪問的數據庫,以針對實際數據集運行測試。 不脆弱的嘲笑。 首先,您應該單獨開發包,原因有很多,其中一個工作台現在已在Laravel 5中棄用。

首先,我們需要dev-require Laravel框架到我們的項目中:

"require-dev": {
    "phpunit/phpunit": "~4.0",
    "phpspec/phpspec": "~2.1",
    "laracasts/testdummy": "~2.0",
    "laravel/laravel": "dev-develop"
},   

現在我們可以創建一個名為DbTestCase的抽象類,我們所有的測試都將從中擴展。 在這個類中,我們將啟動一個Laravel實例和一個內存 SQLite數據庫以提高速度。

如果我們擴展原生Laravel測試類Illuminate\\Foundation\\Testing\\TestCase ,我們已經完成了一些工作。 我們只需要創建一個返回Illuminate\\Foundation\\Application實例的方法。

/**
 * Boots the application.
 *
 * @return \Illuminate\Foundation\Application
 */
public function createApplication()
{
    $app = require __DIR__.'/../vendor/laravel/laravel/bootstrap/app.php';

    $app->register('Path\To\Your\PackageServiceProvider');

    $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();

    return $app;        
}

注意$app->register('Path\\To\\Your\\PackageServiceProvider'); 這個很重要。 在此處包含您的包服務提供者路徑,因此我們將其注冊到我們的packages /vendor文件夾中的Laravel實例。

現在我們運行了一個Laravel應用程序,我們需要設置內存中的SQLite數據庫。 簡單來說,Laravel的TestCase有一個setUp()函數,它在測試前運行,讓我們在那里做:

/**
 * Setup DB before each test.
 *
 * @return void  
 */
public function setUp()
{ 
    parent::setUp();

    $this->app['config']->set('database.default','sqlite'); 
    $this->app['config']->set('database.connections.sqlite.database', ':memory:');

    $this->migrate();
}

我不會給出太多解釋,因為它非常易讀。 正如你在最后一行所看到的那樣,我們也在調用$this->migrate() ,這顯然會在每次運行測試時運行我們的遷移,從而為我們提供一個新的DB來測試。 讓我們看看它是如何工作的:

/**
 * run package database migrations
 *
 * @return void
 */
public function migrate()
{ 
    $fileSystem = new Filesystem;
    $classFinder = new ClassFinder;

    foreach($fileSystem->files(__DIR__ . "/../src/Migrations") as $file)
    {
        $fileSystem->requireOnce($file);
        $migrationClass = $classFinder->findClass($file);

        (new $migrationClass)->up();
    }
}

不要過多細節,基本上我們在這里做的是查看需要所有文件然后運行其遷移的包的src/Migrations文件夾。 它粗糙,需要更多的安全檢查(我將在未來這樣做),但它的工作原理。

為什么不Artisan :: call('migrate')??

簡單! 在Laravel 5中,命令php artisan migrate --package='vendor/package'已被棄用。 現在,開發人員需要創建自己的命令,以生成遷移文件並將其移動到應用程序中的適當位置。 這是一種更靈活的方法。

雖然這個問題已經得到了答案,但我強烈建議使用orchestra / testbench軟件包。

在包的composer.jsonrequire-dev部分添加此包,並確保從README中描述的此包的TestCase擴展任何測試類。

該軟件包能夠加載自定義服務提供程序,注冊自定義別名等,同時啟動完整的Laravel環境進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM