用 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

原文链接 laravel.pro/threads/6

本作品采用《CC 协议》,转载必须注明作者和本文链接
Laravel YES !
wkan
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

赞😄😄😄😄😄😄

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!