antonmi / espec_phoenix

ESpec for Phoenix web framework.
MIT License
137 stars 33 forks source link

Phoenix 1.4 breaks ESpec #54

Open Kukunin opened 5 years ago

Kukunin commented 5 years ago

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

Kukunin commented 5 years ago

The workaround is to add these lines to spec_helper.exs:

Process.unregister(ExUnit.CaptureServer)
{:ok, _} = Application.ensure_all_started(:ex_unit)
edwinthinks commented 5 years ago

@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.

Kukunin commented 5 years ago

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