Laravel:是否可以直接测试函数的json响应输出,而不需要实际通过URI?

Laravel:是否可以直接测试函数的json响应输出,而不需要实际通过URI?,laravel,testing,phpunit,Laravel,Testing,Phpunit,从中,我可以使用以下方法测试从我的应用程序返回的一些json: $response = $this->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertJson([ 'created' => true, ]); 但是,是否可以使用$this->json*方法*,*URI*,*data*绕过实际调用URI;而是测

从中,我可以使用以下方法测试从我的应用程序返回的一些json:

$response = $this->json('POST', '/user', ['name' => 'Sally']);

$response
    ->assertStatus(201)
    ->assertJson([
        'created' => true,
    ]);
但是,是否可以使用$this->json*方法*,*URI*,*data*绕过实际调用URI;而是测试返回json的控制器函数的直接输出?例如,我想做这样的事情:

// My controller:

function getPageData(){
  $data = array('array', 'of', 'data');
  return response()->json($data);
}

// My Test Class:

$controller = new Primary();
$response = $controller->getPageData();

$response->assertJson([
    'array', 'of', 'data'
]);

这可能吗?

对于一些基本方法,您可以这样做,但可能会产生副作用:

app(SomeController::class)->someControllerMethod();
基本上,应用程序将从构造函数中解析依赖项,但不会解析方法依赖项。因此,如果您键入methodRequest$request之类的提示,它将抛出一个错误

我很确定处理请求会造成无意的影响,因为没有真正的请求在进行

编辑:

然后,您可以创建一个TestResponse对象,以获取所有断言:

$res = app(SomeController::class)->someControllerMethod();
$testRes = new Illuminate\Foundation\Testing\TestResponse($res);
$testRes->assertJson(...); // Will be available

这个用例是什么?我相信有更好的方法来处理它。哈-我想我可能会被问到这个问题;我只是想直接、系统地测试控制器中的各种方法。但您可能是对的,我应该放弃使用传统方法测试HTTP响应。看起来在HTTP响应之外直接测试json字符串会很好啊,我相信有更好的方法可以做到这一点。我目前没有引用,但我不久前读到,请求对象不应该在实际请求之外启动。但是,如果确实需要并且您没有引用请求对象,您可以按照我发布的答案来做。对不起,我该如何在测试中使用它?将$response设置为代码的结果并调用$response->assertJson只会产生相同的结果:BadMethodCallException:Method Illumb\Http\JsonResponse::assertJson不存在。是的,响应对象上没有所有这些断言,它们是Laravel TestResponse类的一部分。您必须使用$this->assertJson执行旧方法并解码数据和所有这些。我相信Laravel在幕后使用$this->json创建了一个模拟的$request对象。。。方法,并返回实现测试方法的TestResponse。我真的看不出你为什么要绕过这个。好吧,我显然是用这个来找错人了-没关系。感谢您的输入。实际上,TestResponse需要构造函数中的response对象。您可以创建一个新实例,让所有这些方法都可用,并在答案中检查“我的编辑”。