2012-11-09 36 views
6

我有一箇中等規模的版本,只有少數應用程序。我最近在發行版中將一些常用功能重構爲一個庫應用程序。這使得我的EUnit測試在測試任何需要該庫應用程序的任何東西時都會失敗,並顯示undef消息。依賴於庫應用程序的Erlang EUnit測試模塊

的設立是這樣的:

% In apps/utils/src/utils.erl 
-module(utils). 

-export([foo/0]). 

foo() -> "OH HAI". 

然後

% In apps/some_app/src/some_app.erl 
-module(some_app). 

-export([bar/0]). 

bar() -> io:format("foo: ~s~n", [utils:foo()]). 

% unit tests for bar() 

那麼對於some_app:bar()單元測試失敗。我用rebar eunit skip_deps=true運行它們。我正在使用skip_deps=true,因爲我的發行版使用了一些第三方應用程序(SQL等)。

我認爲測試開始失敗,因爲EUnit正在調用測試中的應用程序而不依賴它?有沒有什麼辦法解決這一問題?我已經配置了.app文件來明確聲明依賴關係。它在發行版中工作正常,現在已經部署了一天沒有問題,但如果我可以再次通過測試,我會感覺好多了:)

(我可以使用模擬應用程序去掉utils:foo/0,我可以看到這將是理想的地方,但這似乎在這種情況下矯枉過正,因爲utils:foo/0(閱讀:它是真實世界的對應物)做一些非常簡單的東西。)

+0

我認爲這與EUnit本身無關,但是Rebar如何運行測試。因爲它在使用skip_deps時不會編譯其他應用程序,或者因爲它不會將它們添加到Erlang代碼路徑中,即使它們以前已經編譯過。 – RichardC

+0

我想我需要深入研究這個鋼筋來源:/我*想* skip_deps標誌只是跳過'deps'目錄中的單元測試(它用於第三方的東西)。 – dantswain

+0

就我看到的鋼筋來源而言,「skip_deps」只是告訴鋼筋跳過'deps'目錄中的應用程序。 – dantswain

回答

1

我能通過做rebar compile eunit skip_deps=true得到這個工作。

關鍵是要有compile在那裏,我不知道爲什麼。我猜測編譯步驟會將所有模塊都存入內存。我很樂意聽到一個很好的解釋。

0

我想你可以讓您的某個應用程序通過將其包含在應用程序部分的.app文件中來加載實用程序,如下所示:

{application,yourapp 
     [{description,"A description"}, 
      {vsn,"1.0.0"}, 
      {modules,[mod1, mod2, utils]}, 
      SNIP 

或以其他方式將其添加到erlang節點的路徑中......可能在啓動節點時使用-pa標誌。

+1

該模塊是另一個應用程序的一部分。它在.app文件的「應用程序」部分列爲依賴項。 'modules'部分是由該應用程序引入的模塊,因此不太合適。無論如何,我嘗試過,但它仍然無法工作。 – dantswain

相關問題