[erlang-questions] Unit Testing gen_server callbacks

Jan Vincent Liwanag <>
Tue Aug 14 09:57:01 CEST 2012


Given the following code:

adder.erl:

start(B) -> gen_server:start(?MODULE, B, []).
add(Pid, N) -> gen_server:cast(Pid, {add, N}).
get_total(Pid, N) -> gen_server:call(Pid, get_total).

init(Total) -> {ok, Total}.

handle_call(get_total, _From, Total) -> {reply, Total, Total}.
handle_cast({add, N}, Total) -> {noreply, N+Total).


It would be better to have a test such that:

{ok, P} = adder:start(0),
adder:add(P, 5),
adder:add(P, 3),
adder:add(P, 2),
?assertEqual(10, adder:get_running_total()).

Rather than:

?assertEqual({noreply, 12}, handle_cast({add, 5}, 7)).
?assertEqual({reply, 100, 100}, handle_call(get_total, somepid, 100)).

For one thing, if I change the gen_server state from an int to a record and fix up the code - the first set of tests should still succeed while the second won't.

On Aug 14, 2012, at 2:41 PM, Daniel Eliasson wrote:

> It should be easy enough to unit test such things, just run a handle_call with the right arguments, and verify that the output and new state is correct?
> 
> I don't think there's a need to actually start the gen_server itself and unit test the callbacks by going through gen_server:call, if that's what you mean. In what way do you find it to be fragile?
> 
> Best,
> Daniel
> 
> On 14 August 2012 03:48, Jan Vincent Liwanag <> wrote:
> Hi,
> 
> What are your thoughts on unit testing gen_server (or other gen_*) callbacks (handle_call, etc) directly? Is this an ok practice? Or should unit tests test only the public api?
> 
> On my end, I find testing gen_server callbacks to be rather fragile. Eager to hear out other thoughts.
> 
> Thanks,
> 
> Jan Vincent Liwanag
> 
> +63 (999) 888-0247
> 
> 
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
> 
> 

Jan Vincent Liwanag

+63 (999) 888-0247

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20120814/2229939a/attachment.html>


More information about the erlang-questions mailing list