作者:青大柠的小号_247 | 来源:互联网 | 2023-05-28 15:24
目前正努力在我正在编写的包中设置集成测试.
对于集成测试,我需要访问Laravel环境,以便我可以访问诸如Artisan :: call('migrate')之类的东西并访问数据库.
目前我猜我需要进行任何测试扩展Laravel TestCase类,引导Laravel环境.虽然我不能训练如何将这个文件调用到我的包中.
其次,在工作台中开发包时,我需要使用Artisan :: call('migrate',' - bench ="vendor/package"')或Artisan :: call('migrate',' - package ="vendor /包"')这令人困惑.
1> AndrewMcLaga..:
我们需要创建一个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'
已被弃用.现在,开发人员需要创建自己的命令,以生成迁移文件并将其移动到应用程序中的适当位置.这是一种更灵活的方法.
2> Propaganista..:
虽然这个问题已经得到了答案,但我强烈建议使用orchestra/testbench软件包.
在包的require-dev
部分添加此包,composer.json
并确保TestCase
按照自述文件中的描述扩展此包中的任何测试类.
该软件包能够加载自定义服务提供程序,注册自定义别名等,同时启动完整的Laravel环境进行测试.