[erlang-questions] Replacing a module with another module

Joseph Wayne Norton norton@REDACTED
Thu Apr 21 07:26:20 CEST 2011


Dmitry -

Hi.  The meck module recently exported some of it's internal utility  
functions.

The recipe below works quite well for my purposes.

thanks,




-module(mocking_module).

-define(MOCK_MOD, module_to_be_mocked).

   :
   :
   :

install_module() ->
     ok = uinstall_module(),
     Forms = meck:abstract_code(meck:beam_file(?MODULE)),
     ok = meck:compile_forms(meck:rename_module(Forms, ?MOCK_MOD),  
meck:compile_options(?MODULE)),
     ok.

uninstall_module() ->
     code:purge(?MOCK_MOD),
     code:delete(?MOCK_MOD),
     ok.


On Thu, 21 Apr 2011 14:15:02 +0900, Dmitry Demeshchuk  
<demeshchuk@REDACTED> wrote:

> Actually, this task is very similar to how meck, effigy and similar  
> stuff work.
>
> So, there's a module named foo that is working. And there's a module
> foo_mock, we want to mock a lot of stuff from the module foo here. Of
> course, we could just use 'start_mocking' function where we declare
> standard meck rules, like
>
> meck:new(foo),
> meck:expect(foo, bar, 0, fun() -> stuff end).
> meck:expect(foo, bar2, 0, fun() -> stuff2 end).
> ...
>
> But this is obviously ugly.
>
> So, the more general way of solving this is to get abstract code of
> the module foo using beam_lib, map through it, replacing the module
> atoms, and compiling it back again.
>
> My questions are:
> 1. Is there an easier way? (Besides loading a module with the same
> name from another path, the circumstances don't allow me that)
> 2. Hasn't anyone already done that? Maybe I'm trying to re-invent
> something obvious here.
>


-- 
norton@REDACTED



More information about the erlang-questions mailing list