如何调试assert_receive上没有消息匹配

时间:2018-04-07 19:10:44

标签: testing elixir

我有这个测试

defmodule InfoSys.Backends.WolframTest do
  use ExUnit.Case, async: true
  alias InfoSys.WolFram

  test "make request, report results, then terminates" do
    ref = make_ref()
    {:ok, pid} = WolFram.start_link("1 + 1", ref, self(), 1)

    assert_receive {:results, ^ref, [%InfoSys.Result{text: "2"}]}
  end
end

我正在接收

  

没有匹配的消息{:results,^ ref,[%InfoSys.Result {text:“2”}]}   100分钟后。

我如何知道哪条消息正在接收或如何调试此错误?我正在关注凤凰书编程实例

整个ExUnit堆栈跟踪:

  1) test make request, report results, then terminates (InfoSys.Backends.WolframTest)
     test/backends/wolfram_test.exs:6
     No message matching {:results, ^ref, [%InfoSys.Result{text: "2"}]} after 100ms.
     The following variables were pinned:
       ref = #Reference<0.214527998.4009754625.219099>
     The process mailbox is empty.
     code: assert_receive {:results, ^ref, [%InfoSys.Result{text: "2"}]}
     stacktrace:
       test/backends/wolfram_test.exs:11: (test)

1 个答案:

答案 0 :(得分:0)

我之前遇到过这类问题。有两个可能的原因:

  • 您的过程花费的时间超过100毫秒才能得到结果。
  • 您的流程有错误。

我更喜欢排除第一种可能性,而我所做的就是让测试等待超过默认时间100 ms。 assert_receive可以接收第二个参数,即以毫秒为单位的时间。你可以尝试这样的事情:

assert_receive {:results, ^ref, [%InfoSys.Result{text: "2"}]}, 5000

其中5000表示5000毫秒或5秒。

在增加时间之后,运行这样的测试有两种可能的结果:

  • 您的测试邮箱不为空:处理您的请求时您的流程很慢。逻辑没有错。也许您的流程正在做的事情是昂贵的操作,或者您需要提高代码的效率。
  • 您的测试邮箱为空
    1. 您的流程和您的逻辑肯定存在问题 应检查代码。
    2. 您低估了流程应该执行的操作的复杂性,您应该找到更有效的方法来执行此操作或更改解决方案。

我已经看到了您正在使用的代码并且它并不太复杂(下次您应该将其作为问题的一部分发布),所以如果您没有&# 39;在5秒钟后你的测试中得到一个回复​​,那么你的过程肯定有问题&#39;代码。

我希望这会有所帮助。