【发布时间】:2009-07-29 19:36:12
【问题描述】:
在用 Java 编写代码时,采用 composition 和 dependency injection 非常有帮助,可以通过模拟协作对象来轻松地进行纯单元测试。
我发现在 Erlang 中做同样的事情不那么简单,而且代码更脏。
这可能是我的错,因为我对 Erlang 还很陌生,而且对 JUnit、EasyMock 和 java 接口很上瘾...
假设我有这个愚蠢的功能:
%% module mymod
handle_announce(Announce) ->
AnnounceDetails = details_db:fetch_details(Announce),
AnnounceStats = stats_db:fetch_stats(Announce),
{AnnounceDetails, AnnounceStats}.
在对mymod进行单元测试时,我只想证明details_db和stats_db使用正确的参数调用,并且返回值使用正确。
details_db 和 stats_db 生成正确值的能力在其他地方进行了测试。
为了解决这个问题,我可以这样重构我的代码:
%% module mymod
handle_announce(Announce, [DetailsDb, StatsDb]) ->
AnnounceDetails = DetailsDb:fetch_details(Announce),
AnnounceStats = StatsDb:fetch_stats(Announce),
{AnnounceDetails, AnnounceStats}.
并以这种方式进行测试(基本上将调用直接存根到测试模块中):
%% module mymod_test
handle_announce_test() ->
R = mymod:handle_announce({announce, a_value}, [?MODULE, ?MODULE, ?MODULE]),
?assertEqual({details,stats}, R).
fetch_details({announce, a_value}) ->
details.
fetch_stats({announce, a_value}) ->
stats.
它可以工作,但是应用程序代码变脏了,我总是不得不随身携带那个丑陋的模块列表。
我尝试了几个模拟库(erlymock 和 (this other one),但我并不满意。
您如何对您的 erlang 代码进行单元测试?
谢谢!
【问题讨论】:
标签: unit-testing dependency-injection erlang mocking