gpt4 book ai didi

php - 如何在 Laravel 中高效地为复杂的业务逻辑编写单元测试

转载 作者:行者123 更新时间:2023-12-04 09:33:27 27 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

上个月关闭。




Improve this question




我正在写一个房间预订引擎。有 3 个层用于计算:Rate Plan、Promotion、BookingQuery(客户发送的请求信息)。
当客户发送预订查询时,包含预订日期、入住日期、退房日期、人数等信息,此请求将通过从房价计划和促销中计算的多层逻辑传递出去结果(是否有房间,价格是多少……等等)。
我确实为我的逻辑中的小计算部分编写了单元测试。但是,我需要编写一个集成测试或一套集成测试,其中包含数百个特定输入数据和特定预期输出数据(不是工厂生成的随机数据)的测试用例。我的实体中有很多关系,例如 $room->ratePlans、$ratePlan->promotions .. 等等。编写一个测试用例已经够累人了,更不用说数百个了。
执行此操作的最有效方法是什么?

最佳答案

这是一个非常开放的问题,我和你一样在同一个地方。我觉得最好的方法是创建助手并根据它来构建数据。测试主要包括 3 个步骤,称为安排、行动和断言。
让我们首先关注安排,这是关于创建您的数据。为它创建助手,这样你就不必重复你自己。多个对象返回是我使用的,以避免调用许多助手。

public function createRoom(array $roomData)
{
$room = factory(Room::class)->create($roomData);

$ratePlans = factory(RatePlan::class, 3)->create(['room_id' => $room->id]);

$promotions = factory(Promotion:class, 3)->create();

$room->promotions()->saveMany($promotions);

return [$room, $ratePlans, $promotions];
}
由于这个任务的范围很模糊,所以只是展示想法。这可以很容易地在您的测试中使用。
public testRoomCreate()
{
[$room, $ratePlans, $promotions] = $this->createRoom();
}
测试的行为部分,调用应用程序是直截了当的。使用 Laravels为此的内置方法,在 Laravel 中实现测试用例。
对于断言,一个好的方法是再次创建标准化的方法来帮助你完成你的过程。
public function assertRoomResponse($response, Room $room)
{
$response->assertJsonStructure(
[
'id',
'type',
]
);

$response->assertJson(
[
'id' => $room->id,
'type' => $room->type,
]
);
}

public function assertRoomDatabaseHas(Room $room)
{
$this->assertDatabaseHas('rooms', [
'type' => $room->type,
]);
}
可能需要更多与关系等相关的逻辑,但如果实现了这一点,您可能会拥有比大多数应用程序更多的断言。这将使您能够编写测试,这非常简单,如下所示,但需要一些维护以保持它们的通用性。这解决了您在编写许多测试时遇到问题的主要问题。
public testRoomCreateWithTypeDouble()
{
[$room, $ratePlans, $promotions] = $this->createRoom(
[
'type' => 'double',
]
);

$response = $this->call('POST', 'api/room', [
'type' => $room->type,
]);

$this->assertRoomResponse($response, $room);
$this->assertRoomDatabaseHas($room);
}

关于php - 如何在 Laravel 中高效地为复杂的业务逻辑编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62713678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com