Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calling verify! should raise a Mox.VerificationError if there are too many calls to a mock #141

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions test/mox_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Annotation: The "verifies when mocks are over-called tests are the tests that are currently failing & that would be useful to me in some of the code I'm working on.

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()

Expand All @@ -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()
Comment on lines +420 to +421
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Annotation: Other places in this test file use a variable-based syntax instead of piping. For example: https://github.com/dashbitco/mox/blob/31217186dc7b618ea35448d2175377408a574fb3/test/mox_test.exs#L175:L181

I find this shorter, pipe-based syntax a bit nicer since it puts visual attention on the async_nolink call rather than on variable assignment, but I don't feel strongly about this choice. If you'd like me to change the syntax to match the existing code I'm happy to!


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
Expand All @@ -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()

Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions test/support/mocks.ex
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
Mox.defmock(CalcMock, for: Calculator)
Mox.defmock(SciCalcOnlyMock, for: ScientificCalculator)
Mox.defmock(SciCalcMock, for: [Calculator, ScientificCalculator])

Mox.defmock(SciCalcMockWithoutOptional,
Expand Down