因此,我开始进行单元测试,并创建了一个用于在我的数据库中创建和调整行的测试。这是代码:
$response = $this->json('POST', '/quotes/3/adjustment',
[
'adjustments' => array([
'description' => 'TEST-Description',
'amount' => 1000,
'quote_id' => 3
])
]
);
$response->assertStatus(201);
当创建它时,我的 Controller 会创建一个调整模型的实例,在该模型中,我有用于创建它的代码:
foreach($request->adjustments as $adjustment) {
if(array_key_exists('id', $adjustment)) {
$this->find($adjustment['id'])->update([
'description' => $adjustment['description'],
'amount' => $adjustment['amount'],
'quote_id' => $quote->id
]);
} else {
$this->create([
'description' => $adjustment['description'],
'amount' => $adjustment['amount'],
'quote_id' => $quote->id,
]);
}
}
return $quote;
所以它期望调整是一个数组,我认为我在测试中对它进行了正确编码,但我得到了 200 响应,这不是预期的 201。关于如何正确传递我的测试文件中的单个数组以使其通过测试的任何想法?
这是我的 Controller :
$adjustment = new Adjustment();
return $adjustment->newAdjustment($quote, $request)->adjustments;
附带说明一下,如果我在 postman 中将其作为原始 JSON(applicatoin/json) 运行,它会在数据库中创建资源:
{
"adjustments": [{
"description": "testing-postman",
"amount": 1000,
"quote_id": 1
}
]
最佳答案
从 Laravel 5.6 开始,如果您从 Controller 返回一个新创建的模型,Laravel 会自动将响应状态设置为 201
。这通常是您在构建遵循 RESTful 实践的 API 时会做的事情。
然而,这可能不适合您的情况,因为您可能需要从 Controller 返回其他数据,而不仅仅是新创建的模型,如果是这样,我相信 Laravel 会返回 200
。
所以你有几个选择:
- 在您的 Controller 中,您可以使用
return response($myData, 201);
强制返回 201
- 仅返回新创建的模型,不返回任何其他内容。
- 或者让您的测试执行以下操作:
$response->assertStatus(200);
$this->assertDatabaseHas('调整', $adjustment->toArray());
对于第三个选项,您的测试正在验证一切正常,并且实际模型已创建并存在于数据库中(您需要根据需要调整它)。
- 有关 Laravel 5.6
201
响应的更多信息:https://laravel.com/docs/5.6/upgrade - 在页面上搜索:返回新创建的模型
关于json - 单元测试 Laravel 需要有关如何正确传递我的变量的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53672424/