Laravel 5.2 PHPUnit JSON Api 请求正文未设置

Posted

技术标签:

【中文标题】Laravel 5.2 PHPUnit JSON Api 请求正文未设置【英文标题】:Laravel 5.2 PHPUnit JSON Api request body not being set 【发布时间】:2017-01-25 06:08:48 【问题描述】:

我正在测试将数据发布到我们使用 Laravel 5.2 创建的 API 端点,但测试中似乎没有任何参数到达应用程序。端点需要 json 并以 json 响应,并使用 FormRequestValidator,它具有 active 和 make 参数所需的规则。测试失败,状态码 422 并且检查响应主体,它指出活动和 make 参数是必需的,即使它们正在调用中传递,因此由于某种原因,当请求到达表单时请求验证器,输入不存在。

但是,当我使用包含 make 和 active 的 Postman 或我们构建的 UI 应用程序的 json 主体调用端点时,它工作正常,它只是在 phpUnit 测试中失败,因此它必须与 PHPUnit 或测试设置有关不正确。这是测试:

public function testItStoresCars()

    // Arrange
    $user = User::first();

    //Act
    $this->json(Request::METHOD_POST, '/v1/cars', [
        'active' => true,
        'make' => 'Audi'
    ], 
    ['Authorization' => 'Bearer '.\JWT::fromUser($user)]));

    // Assert
    $this->assertResponseOk();

我知道从其他通过的测试中正确设置了授权标头。

我尝试禁用中间件,使用 $this->post 辅助方法并手动设置标头,以及使用 $this->call 方法设置标头并使用 json_encode 对数据进行编码,但我总是得到相同的 422回复。我想知道有没有人遇到过这个问题或者可以看到错误?

控制器代码

public function store(CreateCarRequest $request)

    $car = $this->carRepo->save($request->all());

    return response()->json(car);

表单请求

class CreateCarRequest extends Request

public function rules()

    return [
        'active' => 'required|boolean',
        'make' => 'required',
    ];


【问题讨论】:

$user = User::first(); $this->actingAs($user); $this->json('POST', '/vi1/cars', [ 'active' => true, 'make' => 'Audi' ])->assertResponseOk() 尝试这样写,如果它一直失败,检查检查器中的网络选项卡并查找请求,响应或预览是什么? 正如我在问题中提到的,它在 UI 应用程序的浏览器和 Postman 中运行良好。因此,网络选项卡和检查员并没有说明这个问题。这是 PHPUnit 测试的问题,参数丢失或未设置导致请求验证失败并返回 422(验证失败时如预期的那样) 请提供该请求的控制器操作代码和验证规则 添加了控制器和表单请求,非常基础。该代码在不通过 PHPUnit 测试执行时工作正常,我认为这与 TestCase 有关 【参考方案1】:

422 是验证错误的错误响应。这意味着您的数据未发布或未通过服务器验证,请尝试

$this->json(Request::METHOD_POST, '/v1/cars', [
        'active' => true,
        'make' => 'Audi'
    ], 
    ['Authorization' => 'Bearer '.\JWT::fromUser($user)]))->dump();

dump() 应该会显示错误

【讨论】:

问题出在问题里,好像数据没有贴出来但是不知道为什么

以上是关于Laravel 5.2 PHPUnit JSON Api 请求正文未设置的主要内容,如果未能解决你的问题,请参考以下文章

处理来自 PHPUnit (Laravel 5.2) 的自定义异常

使用 Laravel 5.2 的 PHPUnit 未找到自定义异常

如何在 PHPUnit / Laravel 中模拟 JSON 文件

Laravel 5 PHPUnit - 从路由返回了无效的 JSON

phpunit 测试资源 laravel 5.5 返回集合而不是 json

Laravel 5 PHPUnit 测试 json 帖子