如何使用phpunit在具有动态URI的laravel中测试REST api

Posted

技术标签:

【中文标题】如何使用phpunit在具有动态URI的laravel中测试REST api【英文标题】:How to test REST api in laravel having dynamic URI using phpunit 【发布时间】:2018-05-24 20:23:42 【问题描述】:

我正在尝试使用 phpunit 测试我用 laravel faramework 编写的 REST API。 这是我的 api.php 文件代码

Route::group([
  'middleware' => ['cors','db.select'],
  'prefix'     => 'v1/database',
], function() 
    Route::resource('test-beds', 'TestBedController');
);

其中 cors 中间件 允许发送跨域资源共享,而 db.select 中间件 由我创建,它从路由中删除了 database 变量。

在我的 TestBedController 中,如果我不使用 post 方法发送 id 字段,它会给出 HTTP 状态代码 422 的响应。为了验证我是否编写了以下代码。

这是我的 TestBedApiTest.php 文件

class TestBedApiTest extends TestCase 

  public function testRequiresId() 
    // I tried by adding and removing following line but no luck
    $this->WithoutMiddleware();
    $this->json('POST', 'test-beds')->assertResponseStatus(422);
  

但它返回了我 404,这很可能是因为它无法找到路线 test-beds。我尝试了以下代码但没有运气

 $this->json('POST', 'v1/db1/test-beds')->assertResponseStatus(422);

 $this->json('POST', 'api/v1/db1/test-beds')->assertResponseStatus(422);

 $this->json('POST', 'api/v1/test-beds')->assertResponseStatus(422);

 $this->json('POST', 'v1/database/test-beds')->assertResponseStatus(422);

【问题讨论】:

【参考方案1】:

API 测试是个好主意,通过使用 PHP 单元和 guzzle 第 1 步下载 PHP 单元 & guzzle 该库帮助我们向 API 发出请求。 您可以通过

之类的命令安装这两个作曲家
$ composer require guzzlehttp/guzzle:^6.1 phpunit/phpunit:^5.0

通过安装您包含在autoload.php 中的库

然后在api中开发测试类然后运行函数名setup() 然后通过实现你的函数来测试你的 api。

【讨论】:

以上是关于如何使用phpunit在具有动态URI的laravel中测试REST api的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHPUnit 对具有多种用户类型的网站进行单元测试的最佳方法

如何通过phpunit对一个方法进行单元测试,该方法具有多个内部调用保护/私有方法?

如何在 Laravel 的 PHPUnit 中启用 Redis 连接

如何使用 PHPUnit 在类中测试单个 void 方法?

带有模拟的 PHPUnit 测试覆盖率 API

如何使用 phpunit 模拟 Yii@1.1 的 CActiveRecord(避免空属性)?