对于我的产品API的Laravel测试,我试图检查是否为所有产品列出了正确的价格数量。API返回Json,价格是 products..prices* 数组中的项目。
我是Laravel测试的新手。
我如何循环浏览所有产品并查看它们的价格?
$response = $this->getJson('/api/product/');
$json_array = $response->json();
$test_passed = true;
for ($i = 0; $i < count($json_array); $i++) {
//for simplification I check here if all the products have 2 prices
$test_passed = $response->assertJsonCount(2, "product.$i.prices");
}
//check if all the test passed
$this->assertTrue($passed_test);
这工作正常,但它用完内存真的很快。我做错了什么?
更新日期:
我在Laravel API中发现AssertableJson有and -〉each()方法。
$response->assertJson(fn (AssertableJson $json) =>
$json->each(fn (AssertableJson $json) =>
//2 will be dynamic in the final implementation.
$json->has('prices', 2)
)
);
这不起作用,显然......我不能弄清楚this -〉each()是如何工作的,并且在网上找不到示例。我能找到的只是Laravel文档,但他们没有给予嵌套数组的示例。
2条答案
按热度按时间c9x0cxw01#
既然你应该为每一个测试擦干净你的数据库,以一个干净的石板开始,我认为采取的步骤是
1.创建任意数量的
Product
模型以及与之关联的任意数量的Price
模型1.调用API端点
1.Assert
Product
模型的数量与我们在第1步中指定的一样多。1.Assert每个
Product
具有与我们在步骤1中指定的数量相同的Price
模型。注意这里我在foreach中使用了数组的
key
值。这在AssertableJson
语法中是不可能的,因为Closure不接受第二个参数(不像Collection
的each
方法,如果我想使用$collection->each(function ($item, $key) { ... });
,我可以使用键。AssertableJson API有一些限制,因此您不能将其真正用于此测试,除非您制作单一类型的产品。
您可以创建的另一个测试是针对返回的json结构的测试,这对jsonapi很重要。
我用你发布的json(jsonblob.com/1087309750307405824)测试了最后一个,它通过了。
lmvvr0a82#
基于你在这里发布的JSON:https://jsonblob.com/1087309750307405824一些小的改变可以解决你的问题
如果你的代码内存不足,可能是你的数据库中的所有产品和产品JSON大小太大,或者可能是你的系统内存限制。
要检查php内存使用情况,可以在“for循环”中使用memory_get_usage函数