I seem to be getting some strange undefined behavior when defining multiple separated mocks for the same module in the same test:
HttpClientMock
|> expect(:request, fn request -> build_response() end)
|> allow(self(), fn -> Process.whereis(MyProcess) end)
# Later in that same test
HttpClientMock
|> expect(:request, fn request -> build_another_response() end)
|> allow(self(), fn -> Process.whereis(MyNewProcess) end)
Is this a limitation that Mox has? I’ve read already the documentation a few times and I couldn’t find any things specified about this, it is completely unclear what happens under the hood as it seems these definitions are doing only side-effects.
I skimmed through the docs and the code and I suspect you’re encountering a bug. The new expectations are probably not merged correctly with the existing ones.
This is extremely strange because this is not consistent, even though my calls in tests are always deterministic. Sometimes the test can fail on the second expectation and sometimes on the first one.
I am not sure how I can show an example, what I have are multiple genservers (some of them dependent on each-other) hitting multiple HTTP APIs.
I can confirm that with version 1.1.0, even with the race condition fixed in my application code, the tests still fail randomly as before, I’ve actually upgraded the dependency right in the middle of writing this topic so I might have experienced that bug too before upgrading. I did not mention it, because I didn’t saw bugfixes mentioned in changelogs of the new version. Thanks for the fix!