[erlang-questions] Mocking in Erlang
Christian S
chsu79@REDACTED
Sat Jun 7 18:57:09 CEST 2008
> True. And something I would like even better is if I could generate
> that module in a few lines close to the eunit test function. (Cant be
> impossible to create a module directly from a list of atoms and funs.
> Doesnt need to be fast.)
>
> A downside is that the module namespace is node-wide, so you cant
> safely run your tests in parallell on the same node. This is a reason
> I consider this to be a very dirty way to slip in the mock.
To follow up on myself. I hacked up something that almost fulfills my wishes:
You load this module that follows the inteface of an error_handler:
-module(mock).
-compile(export_all).
undefined_function(Mod, F, Args) ->
case get(Mod) of
undefined ->
exit({undefined, Mod, F, Args});
MockDict ->
Fun = dict:fetch(F, MockDict),
apply(Fun, Args)
end.
undefined_lambda(_Mod, _Fun, _Args) ->
exit(undef).
Second, I put this in my process to install the above error_handler
for this process:
init() ->
Mock = dict:from_list([{eat, fun() -> yum end}]),
put(banana, Mock),
process_flag(error_handler, mock),
loop().
Whenever this process calls banana:eat(), it will get the atom 'yum'
back. Completly process local.
YES! It is dirty! The prettiest flowers grow in manure!
PS.
http://paste.lisp.org/display/61885 has more of the code and
experiment, at least until it goes away in a couple of hours.
More information about the erlang-questions
mailing list