目前正在努力在我正在编写的包中设置集成测试。
对于集成测试,我需要访问Laravel环境,以便可以访问诸如Artisan::call('migrate')之类的内容并访问数据库。
目前我猜我需要让任何测试扩展 Laravel TestCase 类,引导 Laravel 环境。虽然我无法弄清楚如何将此文件调用到我的包中。
其次,在工作台中开发软件包时,我需要使用 Artisan::call('migrate', '--bench="vendor/package"')或 Artisan::call('migrate', '--package="vendor/package"') 这很令人困惑。
我们需要创建一个 Laravel 的实例,以及一个 PHPUnit 可以访问的数据库,以针对真实世界的数据集运行测试。不是脆弱的嘲笑。首先,出于多种原因,您应该单独开发软件包,其中一个原因是 Workbench 现在在 Laravel 5 中被弃用。
因此,首先我们需要将Laravel框架dev-require
到我们的项目中:
"require-dev": {
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1",
"laracasts/testdummy": "~2.0",
"laravel/laravel": "dev-develop"
},
现在我们可以创建一个名为 DbTestCase
的抽象类,我们所有的测试都将从中扩展。在本课程中,我们将启动Laravel的实例和一个内存SQLite数据库以提高速度。
如果我们扩展原生Laravel测试类IlluminateFoundationTestingTestCase
那么一些工作已经为我们完成了。我们只需要创建一个返回 IlluminateFoundationApplication
实例的方法。
/**
* Boots the application.
*
* @return IlluminateFoundationApplication
*/
public function createApplication()
{
$app = require __DIR__.'/../vendor/laravel/laravel/bootstrap/app.php';
$app->register('PathToYourPackageServiceProvider');
$app->make('IlluminateContractsConsoleKernel')->bootstrap();
return $app;
}
请注意这$app->register('PathToYourPackageServiceProvider');
这很重要的行。在此处包含您的包服务提供程序路径,以便我们将其注册到位于我们的包/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()
,每次我们运行测试时,它显然都会运行我们的迁移,为我们提供一个新的数据库进行测试。让我们看看它是如何工作的:
/**
* 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'
已被弃用。开发人员现在需要创建自己的命令,以生成迁移文件并将其移动到应用程序中的适当位置。这是一种更灵活的方法。
虽然这个问题已经有一个公认的答案,但我强烈建议使用管弦乐队/测试平台包。
将此包添加到包composer.json
的require-dev
部分中,并确保按照自述文件中的说明从此包的TestCase
扩展任何测试类。
该软件包能够加载自定义服务提供商,注册自定义别名等,同时启动完整的Laravel环境进行测试。