Okay, that makes sense. :)
On Friday, March 28, 2025 at 1:41:26 PM UTC+1 José Valim wrote:

> Thanks for the proposal.
>
> The difference between assert_receive to assert_wait, if my understanding 
> is correct, is that assert_receive is based on messages, while assert_wait 
> is a busy loop (i.e. you keep retrying after some time until it succeeds). 
> And the reason we haven't added something similar to Elixir is because you 
> should prefer message driven loops as much as possible, and we should 
> strongly nudge people towards solutions like assert_receive.
>
>
> *José Valimhttps://dashbit.co/ <https://dashbit.co/>*
>
>
> On Fri, Mar 28, 2025 at 1:10 PM David Pavlík <d.p...@gmail.com> wrote:
>
>> Hi!
>>
>>
>> In our codebase, we use a macro called assert_wait that behaves like 
>> assert but retries if it fails until some timeout is exceeded. If the 
>> timeout is reached, it raises in the same way as a failing assert would.
>>
>>
>> We've been using it for about a year and are quite happy with it. We find 
>> it very convenient for testing asynchronous behaviors in integration tests. 
>> For example, when you tell some process to asynchronously do something, you 
>> can then use assert_wait to check that the process has done it and done 
>> it correctly. It can also act as a synchronization mechanism as it “pauses 
>> execution” of the test until the given condition holds.
>>
>>
>> Example:
>>
>>
>> test "input is correctly processed by the processing pipeline" do
>>
>> input = ...
>>
>> expected_output = ...
>>
>>
>> {:ok, ref} = PipelineManager.start_pipeline(input)
>>
>> assert_wait %{status: :finished, output_file: output_file} = 
>> PipelineManager.get_info(ref)
>>
>> assert expected_output == File.read!(output_file)
>>
>> end
>>
>>
>>
>> Of course, testing based on timeouts is not ideal. If you set the timeout 
>> too low or if the machine is currently under heavy load, the timeout may be 
>> exceeded even when everything is going well so far. However, sometimes 
>> there are no easy alternatives. It’s similar to assert_receive/3 or 
>> Phoenix.LiveViewTest.assert_redirect/2 that also have a timeout (though 
>> based on receive and not retrying).
>>
>>
>> Do you think it would be generally useful to have something like this in 
>> ExUnit? If so, I can tidy the code a bit and send a PR.
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-co...@googlegroups.com.
>> To view this discussion visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/d0e3cadf-50fb-4c66-a7d8-31feda17b9cfn%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/d0e3cadf-50fb-4c66-a7d8-31feda17b9cfn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/elixir-lang-core/b219446e-e483-4db7-b444-737f41df2233n%40googlegroups.com.

Reply via email to