Assert_receive для проверки обработчиков сообщений Genserver? - PullRequest
0 голосов
/ 16 апреля 2019

Я хотел бы иметь возможность отлавливать сообщения, идущие на мой GenServer handle_info, в тестах, чтобы проверить, что именно это я и собираюсь сделать.?2 / Используя assert_receive есть ли способ перехватить эти сообщения?Должен ли я установить assert_receive до или после вызова внешней службы, что приведет к триггеру handle_info?Какой синтаксис я должен использовать?

Я пробовал много комбинаций assert_receive и пытался receive do..., чтобы попытаться отобразить входящие сообщения, но безуспешно.

1 Ответ

1 голос
/ 17 апреля 2019

Оба ExUnit.Assertions.assert_receive/3 и ExUnit.Assertions.assert_received/2 делают сообщения, поступающие в почтовый ящик текущего процесса . Первый из них должен называться до или после сообщение было фактически отправлено:

Утверждает, что сообщение, соответствующее pattern, было или будет получено в течение периода timeout, указанного в миллисекундах.

последний должен называться после :

Утверждает, что шаблон соответствия сообщений был получен и находится в почтовом ящике текущего процесса.

Тем не менее, оба вряд ли подходят для тестирования существующего GenServer. Сообщения должны поступать в окно сообщений GenServer, эта функция предоставляется OTP, и вы не должны проверять это. Если вам нужно регистрировать сообщения, добавьте вызов к Logger.log/3 к handle_info/2 и проверьте, что журнал действительно происходит с ExUnit.CaptureLog.capture_log/2. Если при поступлении сообщения оно выполняет какое-либо действие, проверьте это действие.

Как правило, вам следует проверять код, а не OTP.

...