espec_phoenix
espec_phoenix copied to clipboard
Phoenix 1.4 breaks ESpec
I have channel tests using Phoenix.ChannelTest
which is broken in ESpec and Phoenix 1.4.0.
It crashes with:
** (ArgumentError) could not fetch application environment :refute_receive_timeout for application :ex_unit because the application was not loaded/started. If your application depends on :ex_unit at runtime, make sure to load/start it or list it under :extra_applications in your mix.exs file
It happens so, because previosly, they received timeout for refute_broadcast
function from argument: https://hexdocs.pm/phoenix/1.3.4/Phoenix.ChannelTest.html#refute_broadcast/3,
but in 1.4.0, they try to fetch :ex_unit
application, which fails.
Also, :ex_unit
application can't be start because of:
** (MatchError) no match of right hand side value: {:error, {:ex_unit, {{:shutdown, {:failed_to_start_child, ExUnit.CaptureServer, {:already_started, #PID<0.496.0>}}}, {ExUnit, :start, [:normal, []]}}}}
since espec starts ExUnit.CaptureServer on its side
The workaround is to add these lines to spec_helper.exs
:
Process.unregister(ExUnit.CaptureServer)
{:ok, _} = Application.ensure_all_started(:ex_unit)
@Kukunin just to clarify does adding ex_unit
to your extra_applications not solve this issue? I happen to be using ex_unit
assertions for my specs since I don't believe Espec supports assert_reply
and assert_broadcast
. Might be a cool thing to add in soon.
It doesn't solve since both espec and ex_unit starts ExUnit.CaptureServer
. So whoever starts it second, it crashes with already running
. That's why I do Process.unregister(ExUnit.CaptureServer)
first