[英]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.json
的require-dev
部分添加此包,並確保從README中描述的此包的TestCase
擴展任何測試類。
該軟件包能夠加載自定義服務提供程序,注冊自定義別名等,同時啟動完整的Laravel環境進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.