diff --git a/test/mox_test.exs b/test/mox_test.exs index 5743546..e7c1152 100644 --- a/test/mox_test.exs +++ b/test/mox_test.exs @@ -363,6 +363,24 @@ defmodule MoxTest do assert_raise Mox.VerificationError, message, &verify!/0 end + test "verifies when mocks are over-called in the process in private mode" do + set_mox_private() + + verify!() + expect(CalcMock, :add, 1, fn x, y -> x + y end) + + # Emulate mock calls within code that has aggressive error handling + try do + CalcMock.add(1, 2) + CalcMock.add(3, 4) + catch _, _ -> + :ok + end + + message = ~r"expected CalcMock.add/2 to be invoked once but it was invoked 2 times" + assert_raise Mox.VerificationError, message, &verify!/0 + end + test "verifies all mocks for the current process in global mode" do set_mox_global() @@ -385,6 +403,26 @@ defmodule MoxTest do message = ~r"expected CalcMock.add/2 to be invoked 2 times but it was invoked once" assert_raise Mox.VerificationError, message, &verify!/0 end + + test "verifies mocks are over-called for the current process in global mode" do + start_supervised!({Task.Supervisor, name: MoxTests.TaskSupervisor}) + set_mox_global() + + verify!() + expect(CalcMock, :add, 1, fn x, y -> x + y end) + + message = ~r"expected CalcMock.add/2 to be invoked once but it was invoked 0 times" + assert_raise Mox.VerificationError, message, &verify!/0 + + Task.Supervisor.async_nolink(MoxTests.TaskSupervisor, fn -> + CalcMock.add(2, 3) + CalcMock.add(4, 5) + end) + |> Task.yield() + + message = ~r"expected CalcMock.add/2 to be invoked once but it was invoked 2 times" + assert_raise Mox.VerificationError, message, &verify!/0 + end end describe "verify!/1" do @@ -405,6 +443,25 @@ defmodule MoxTest do assert_raise Mox.VerificationError, message, &verify!/0 end + test "verifies when mocks are over-called in the process in private mode" do + set_mox_private() + + verify!(CalcMock) + expect(CalcMock, :add, 1, fn x, y -> x + y end) + expect(SciCalcOnlyMock, :exponent, fn x, y -> x * y end) + + # Emulate mock calls within code that has aggressive error handling + try do + CalcMock.add(1, 2) + CalcMock.add(3, 4) + catch _, _ -> + :ok + end + + message = ~r"expected CalcMock.add/2 to be invoked once but it was invoked 2 times" + assert_raise Mox.VerificationError, message, fn -> verify!(CalcMock) end + end + test "verifies all mocks for current process in global mode" do set_mox_global() @@ -428,6 +485,27 @@ defmodule MoxTest do assert_raise Mox.VerificationError, message, &verify!/0 end + test "verifies mocks are over-called for the current process in global mode" do + start_supervised!({Task.Supervisor, name: MoxTests.TaskSupervisor}) + set_mox_global() + + verify!() + expect(CalcMock, :add, 1, fn x, y -> x + y end) + expect(SciCalcOnlyMock, :exponent, fn x, y -> x * y end) + + message = ~r"expected CalcMock.add/2 to be invoked once but it was invoked 0 times" + assert_raise Mox.VerificationError, message, fn -> verify!(CalcMock) end + + Task.Supervisor.async_nolink(MoxTests.TaskSupervisor, fn -> + CalcMock.add(2, 3) + CalcMock.add(4, 5) + end) + |> Task.yield + + message = ~r"expected CalcMock.add/2 to be invoked once but it was invoked 2 times" + assert_raise Mox.VerificationError, message, fn -> verify!(CalcMock) end + end + test "raises if a non-mock is given" do assert_raise ArgumentError, ~r"could not load module Unknown", fn -> verify!(Unknown) diff --git a/test/support/mocks.ex b/test/support/mocks.ex index bd56b15..95a7bc8 100644 --- a/test/support/mocks.ex +++ b/test/support/mocks.ex @@ -1,4 +1,5 @@ Mox.defmock(CalcMock, for: Calculator) +Mox.defmock(SciCalcOnlyMock, for: ScientificCalculator) Mox.defmock(SciCalcMock, for: [Calculator, ScientificCalculator]) Mox.defmock(SciCalcMockWithoutOptional,