gpt4 book ai didi

php - 使用基于 Active Record 的框架进行单元测试

转载 作者:可可西里 更新时间:2023-10-31 22:51:09 25 4
gpt4 key购买 nike

我正在使用一个基于 Active Record pattern 的 ORM 框架.我数据库中的每个表都绑定(bind)到我的代码中的一个模型。

我想对这些模型进行单元测试,所以我首先从模型中提取每个 save()update() 调用,以便只对对象进行更改, 它们只会在需要时持久化。

不过,我不知道如何在这种情况下应用此策略。我有一个 Chat 模型,User 是其中的一部分,User 可以将 ChatNote 添加到聊天

这是当前的实现:

// User.php
public function addChatNote($chatNoteContent, Chat $chat)
{
$chatNote = new ChatNote();
$chatNote->content = $chatNoteContent;
$chatNote->save();

$chat->note()->associate($chatNote);
$chat->save();
}

现在在我看来这里有很多问题,但是 save() 调用真的毁了我在这里进行正确单元测试的机会。

我考虑过在使用该方法之前创建 ChatNote,但是应该由哪个类负责创建它?我也可以将它保存在其他地方,并将 Chat 保存在其他地方,但是 User 除了将 ChatNote聊天 ? save() 应该在哪里制作?

最佳答案

Indeed some classicist xunit testers also argue that any collaboration with external resources, such as a database or filesystem, should use doubles. Partly this is due to non-determinism risk, partly due to speed. While I think this is a useful guideline, I don't treat using doubles for external resources as an absolute rule. If talking to the resource is stable and fast enough for you then there's no reason not to do it in your unit tests.

( Martin Fowler )

您似乎在使用 Laravel。该框架提供了一些开箱即用的简单方法来集成 the database in your tests .

Antoher 通常的做法是使用单独的内存数据库进行测试。您甚至可以在每次测试之前从头开始创建模式(运行所有迁移)。只需将此添加到您的 phpunit.xml:

<php>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php>

关于php - 使用基于 Active Record 的框架进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43689828/

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