gpt4 book ai didi

testing - 如何正确测试 GenServer 中的 handle_cast?

转载 作者:行者123 更新时间:2023-11-28 19:56:05 26 4
gpt4 key购买 nike

我有一个 GenServer,它负责联系外部资源。调用外部资源的结果并不重要,偶尔失败是可以接受的,所以使用 handle_cast 似乎适用于代码的其他部分。我确实有一个用于该外部资源的类似接口(interface)的模块,并且我正在使用一个 GenServer 来访问该资源。到目前为止一切顺利。

但是当我尝试为这个 gen_server 编写测试时,我不知道如何测试 handle_cast。我有 GenServer 的接口(interface)函数,我尝试测试那些函数,但它们总是返回 :ok,除非 GenServer 未运行。我无法对此进行测试。

我稍微修改了代码。我将 handle_cast 中的代码抽象成另一个函数,并创建了一个类似的 handle_call 回调。然后我可以轻松地测试 handle_call,但那有点 hack。

我想知道人们通常如何测试异步代码,就像那样。我的方法是否正确或可以接受?如果不是,那怎么办?

最佳答案

诀窍是记住 GenServer 进程按顺序一条一条地处理消息。这意味着我们可以确保进程接收并处理了消息,方法是确保它处理了我们稍后发送的消息。这反过来意味着我们可以将任何异步操作更改为同步操作,方法是在其后跟上同步消息,例如一些调用。

测试场景如下所示:

  1. 发出异步请求。
  2. 发出同步请求并等待结果。
  3. 断言异步请求的影响。

如果服务器没有任何合适的同步功能,您可以考虑使用 :sys.get_state/2 - 一个用于调试目的的调用,由所有特殊进程正确处理(包括 GenServer)并且可能最重要的是同步。我认为将它用于测试是完全有效的。

您可以从 GenServer documentation on debugging 中的 :sys 模块中阅读更多关于其他有用功能的信息.

关于testing - 如何正确测试 GenServer 中的 handle_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41011145/

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