用 TDD 的方式为 Laravel 开发扩展
起因
最近在做一些 TDD 开发的尝试,由于需要一个比较通用的功能,所以打算做一个 Laravel 的扩展。现在做 Laravel 扩展的教程好像不多见,经过我的一番研究之后就有了这个教程。
至于我做的扩展包,那就以后再讲,我们先来讲讲怎么做扩展开发。
当然,我们要用 TDD 的方式来开发扩展。
关于 Laravel 扩展
扩展主要有两种形式,一种是通用的 composer 包,这些扩展可以在任何框架里使用,不限于 Laravel;另一种是 Laravel 专用的扩展包,只能在 Laravel 中使用。我们这里要讲的是后一种 Laravel 专用的扩展。
通过查阅官方文档关于扩展包开发的章节,我们可以了解到:扩展 Laravel 的主要方式是通过 ServiceProvider 。
那就直接上手吧!
创建项目
首先为扩展项目创建一个文件夹,然后在项目文件夹里初始化 composer 项目:
composer init
接下来初始化程序会问你一些问题。
其中 Package Type 部分我们要选择 library
。
当问到是否需要添加依赖时可以先输入 no
,跳过交互式添加依赖。
然后我们来手动添加一些依赖包:
composer require --dev phpunit/phpunit
composer require --dev orchestra/testbench
phpunit
大家应该很熟悉了,是用来运行测试的。
orchestra/testbench
这个包是 TDD 开发扩展包的关键,它可以让你在测试模拟 Laravel 框架的行为。通过这个包,我们就不用把扩展包放到实际的 Laravel 项目里做测试了。
然后,我们要生成 phpunit 的配置文件:
./vendor/bin/phpunit --generate-configuration
这里可以直接使用默认的配置。
再在 composer.json
文件里设置 autoload :
+ "autoload": {
+ "psr-4": {
+ "My\\LaravelPackage\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "My\\LaravelPackage\\Tests\\": "tests/"
+ }
+ },
设置好后运行一下 compsoer dump-autoload
重新生成 autoload 文件。
为扩展编写测试
现在我们可以试着给扩展来写一个测试,这里期望我们的扩展可以给 Laravel 项目添加一个接口,这个接口返回扩展的名字:
// tests/ExampleTest.php
<?php
namespace My\LaravelPackage\Tests;
class ExampleTest extends \Orchestra\Testbench\TestCase {
protected function getPackageProviders($app)
{
return [LaravelPackageServiceProvider::class];
}
public function testApi()
{
$response = $this->getJson('/laravel-package/name');
$response->assertJson(['name' => 'laravel-package']);
}
}
测试中有两个要点:
- 继承
\Orchestra\Testbench\TestCase
类; - 添加
getPackageProviders
方法,返回扩展的ServiceProvider
类;
实现扩展
这里运行测试,肯定是不通过的,不过我就不在这里讲 TDD 了,我们来看看实现后的扩展是什么样的。
别忘了实现 Laravel 扩展的方式是通过 ServiceProvider
,我们先来加上 LaravelPackageServiceProvider
:
// src/LaravelPackageServiceProvider.php
<?php
namespace My\LaravelPackage;
use Illuminate\Support\ServiceProvider;
class LaravelPackageServiceProvider extends ServiceProvider
{
public function boot()
{
$this->loadRoutesFrom(__DIR__.'/routes.php');
}
}
然后是路由文件:
// src/route.php
<?php
Route::get('/laravel-package/name', function () {
return ['name' => 'laravel-package'];
});
路由就像标准的 Laravel 应用一样写。
这样测试就可以通过了,不过这个扩展没有实际用处。
关于更多测试的写法可以参考 github.com/orchestral/testbench 。
本作品采用《CC 协议》,转载必须注明作者和本文链接
赞😄😄😄😄😄😄