メッセージを特定の順序で送信するエリクシールモジュールを構築しています。そして、私は問題がある。このエリクサーメッセージをアサートする方法
MyModule.send_msgs(self())
assert_received {:event, 1}
assert_received {:event, 2}
assert_received {:event, 3}
のようなユニットテストを書いて、私はassert_received
順序をシャッフルしても、テストはまだ合格します。
MyModule.send_msgs(self())
assert_received {:event, 2}
assert_received {:event, 1}
assert_received {:event, 3}
assert_received
は、メッセージ到着の順序を気にしないようです。 assert_received
だけでなく、私が思い出す限り、receive
もメッセージが乱れることがあります。 ここで私の質問は、到着したメッセージが順序どおりに受信できない場合、その順序をどうやって保証できるのでしょうか?
あなたはおそらく最初に順番に到着したメッセージに頼るべきではありません 場所。たとえば、そこに状態を構築するときに、受信者のメッセージを並べ替えることができます。必要に応じて、メッセージと一緒に注文指数を送信してください。 –
@PatrickOscityはあまりにも非効率かもしれません。多くのモジュール、たとえば'gen_tcp'は、インデックスのないメッセージでデータを送信し、プロセスAからBに送信されたメッセージが確実に到着することが保証されているという事実に依存します。 – Dogbert
@Dogbertわかりました。どういうわけか、もっと一般的なシナリオが考えられました。これは、最近取り組んでいるコードのために、複数のプロセスが「コレクタ」プロセスにメッセージを送信していたためです。もちろんその場合、着信メッセージの順序付けに対する保証はできません。 –