[erlang-questions] How to meck?

39 views
Skip to first unread message

Bohuslav Svancara

unread,
Jan 10, 2012, 10:47:31 AM1/10/12
to erlang-q...@erlang.org
Hello!
I am trying to use meck, but have no luck.
Can you help me, please?

Erlang version: Erlang 5.9/OTP R15B

---------- tested module:
-module(meck_module_for_test).
-compile(export_all).
a() -> a.
call_a() -> a().

------------------------- testing module:
-module(meck_test).
-compile(export_all).
test()->
    ok = meck:new(meck_module_for_test,[passthrough]), % Docs says: Retains the original functions, if not mocked by meck.
   
    % Mock "a()" which is called from call_a().
    ok = meck:expect(meck_module_for_test, a, 0, fun() -> "result_from_mocked_a" end ),
   
    Result = meck_module_for_test:call_a(),
    io:format("Result of call_a: ~p~n",[Result]),
   
    Result_A = meck_module_for_test:a(),
    io:format("Result of a: ~p~n",[Result_A]),
   
    Valid = meck:validate(meck_module_for_test),
    io:format("Valid: ~p~n",[Valid]),
   
    meck:unload(meck_module_for_test),   
    ok.

--------------------- result of meck_test:test():
Result of call_a: a
Result of a: #Fun<meck_test.1.126597877>
Valid: true
ok
-----------------------------

I believe that call_a() should call a mocked version of a() which should return "result_from_mocked_a".
So the result from call_a() shoud be:"result_from_mocked_a"
But my results are different.

Can you help me, please?

Thanks,
Bob

Magnus Klaar

unread,
Jan 10, 2012, 11:50:06 AM1/10/12
to Bohuslav Svancara, erlang-q...@erlang.org
Hi!

You can only mock external calls using meck, this means that you must prefix the call to a() in meck_module_for_test:call_a/0 with  meck_module_for_test: or ?MODULE: to ensure that the call is handled by the mocked version of the module. When you make a local call to a function in the same module it will always call the function defined in the current module version.

MVH Magnus

_______________________________________________
erlang-questions mailing list
erlang-q...@erlang.org
http://erlang.org/mailman/listinfo/erlang-questions


Bohuslav Svancara

unread,
Jan 10, 2012, 6:27:35 PM1/10/12
to erlang-q...@erlang.org
Thank you, but it does not help.

---------- modified tested module:

-module(meck_module_for_test).
-compile(export_all).
a() -> a.
call_a() -> meck_module_for_test:a(). % changed line

-------  testing module "meck_test" is the same (se below)

Result:

1> meck_test:test().
Result of call_a: #Fun<meck_test.1.84433456>
Result of a: #Fun<meck_test.1.84433456>
Valid: true
ok


Bob




2012/1/10 Magnus Klaar <magnus...@gmail.com>

Magnus Klaar

unread,
Jan 10, 2012, 7:06:23 PM1/10/12
to Bohuslav Svancara, erlang-q...@erlang.org
Hi!

Comparing the output in the two posts, the first one returns 'a' from call_a() and the return value you specified using meck:expect/4 from the a() function, the second one shows that both call_a() and a() returns the value you specified.

If you want to return  "result_from_mocked_a" from these functions you must invoke meck:expect/3 or /4 as:

meck:expect(meck_module_for_test, a, 0, "result_from_mocked_a") or
meck:expect(meck_module_for_test, a, fun() -> "result_from_mocked_a" end )

MVH Magnus

Bohuslav Svancara

unread,
Jan 11, 2012, 5:24:53 AM1/11/12
to erlang-q...@erlang.org
Thanks for your help, Magnus. It works fine now.

Bob

2012/1/11 Magnus Klaar <magnus...@gmail.com>
Reply all
Reply to author
Forward
0 new messages