eproxus / meck

A mocking library for Erlang
http://eproxus.github.io/meck
Apache License 2.0
811 stars 231 forks source link

Deleting existing function does not work #238

Open Juliusan opened 2 years ago

Juliusan commented 2 years ago

It was possible to delete the function, that is implemented, using meck:delete in version 0.9.0, however in 0.9.1 this throws an error.

Reproduction Steps

  1. Implement a module with some exported function:
    -module(some_module).
    -export([some_function/2]).
    some_function(SomeArg1, SomeArg2) ->
    {ok, SomeArg1, SomeArg2}.
  2. Delete the exported function using meck and check if it is still available to be called.

Expected behavior

This test should pass:

meck_delete_test() ->
    ok = meck:new(some_module, [passthrough]),
    ?assert(erlang:function_exported(some_module, some_function, 2)),
    ok = meck:delete(some_module, some_function, 2, true),
    ?assertNot(erlang:function_exported(some_module, some_function, 2)),
    ?assert(meck:validate([some_module])),
    ok = meck:unload([some_module]).

Observed behavior

The test fails, indicating that second call to function_exported is still true.

Versions

Alberdi commented 8 months ago

Adding the non_strict flag makes the test above pass:

meck_delete_test() ->
    ok = meck:new(some_module, [passthrough, non_strict]),
    ?assert(erlang:function_exported(some_module, some_function, 2)),
    ok = meck:delete(some_module, some_function, 2, true),
    ?assertNot(erlang:function_exported(some_module, some_function, 2)),
    ?assert(meck:validate([some_module])),
    ok = meck:unload([some_module]).

I'm not sure about the exact semantics of combining passthrough with non_strict to know if this was a hidden "feature", or if this brings new problems. But this seems to work, at least, as a workaround.