2011-11-13 56 views
7

我正在編寫Erlang代碼的EUnit測試。EUnit無法測試私人函數

我有一個源模塊:

-module(prob_list). 
-export([intersection/2,union/2]). 

probability([], _Item) -> false; 
probability([{First,Probability}|Rest], Item) -> 
    if 
     First == Item -> Probability; 
     true   -> probability(Rest, Item) 
    end. 
... 
... 
... 

和單元測試模塊:

-module(prob_list_tests). 
-include_lib("eunit/include/eunit.hrl"). 

-define(TEST_LIST,[{3,0.2},{4,0.6},{5,1.0},{6,0.5}]). 
-define(TEST_LIST1,[{2,0.9},{3,0.6},{6,0.1},{8,0.5}]). 
-define(TEST_UNO_LIST,[{2,0.5}]). 

probability_test() -> ?assertNot(prob_list:probability([],3)), 
         ?assertEqual(0.5,prob_list:probability(?TEST_UNO_LIST,2)), 
         ?assertNot(prob_list:probability(?TEST_UNO_LIST,3)), 
         ?assertEqual(0.2,prob_list:probability(?TEST_LIST,3)), 
         ?assertEqual(1.0,prob_list:probability(?TEST_LIST,5)), 
         ?assertNot(prob_list:probability(?TEST_LIST,7)). 
... 
... 
... 

當我運行eunit:test(prob_list,[verbose])它說:

prob_list_tests: probability_test...*failed* 
::undef 

,但是當我出口probability/2在我的prob_list模塊中,一切正常。

有什麼方法可以測試私人功能嗎?

回答

3

好了,所以這裏有雲:

dclements給了我一個很好的提示我怎麼能做到什麼,我問過。我不想把所有的測試都放在源代碼模塊中,你可以看到一個很好的例子:Erlang EUnit – introduction

現在我的解決方案是導出TEST編譯的所有函數。所以你就把:

-define(NOTEST, true). 

-export([intersection/2,union/2]). 
-ifdef(TEST). 
-export([intersection/2,union/2,contains/2,probability/2,lesslist/2]). 
-endif. 

然後用erlc -DTEST *.erl編譯運行測試,與普通編譯只導出所需的功能。

+1

這是一個合理的方法(儘管值得注意的是你可以有多個導出行,這可能會清理一些東西),特別是如果你想要將你的單元測試分解成單獨的文件和測試你的私有函數。這種方法的一個缺點是,這可能會導致代碼通過測試,但如果您意外地在測試文件之外使用私有方法,則不會運行。 –

+1

要將所有內容暴露給測試模塊,您可以使用「-compile(export_all)」。而不是維持一個大的出口聲明。 – goertzenator

8

,我使用的這個一般的方法是包括所有的單元測試在同一文件和他們分離出:

 
-ifdef(TEST). 
-include_lib("eunit/include/eunit.hrl"). 
-endif. 

%% Functions 
[...] 


-ifdef(TEST). 
%% Unit tests go here. 
-endif. 

這應該允許您測試您的私有函數旁邊的公共功能。

+0

我所做的一切,但我得到了相同的結果。 我運行'erlc -DTEST * .erl'來編譯,而且我仍然從私有函數中得到:: undef。 – Uko

+0

好吧,我的錯,我忘了在測試中從函數調用中刪除模塊名稱。 – Uko

5

您可以使用該指令-compile(export_all)有條件地導出所有功能只when compiling for testing:你已經寫了

%% Export all functions for unit tests 
-ifdef(TEST). 
-compile(export_all). 
-endif.