2012-11-09 2 views
6

Ich habe eine mittelgroße Version mit einer Handvoll Anwendungen. Ich habe vor kurzem eine allgemeine Funktionalität in einer Bibliotheksanwendung innerhalb der Version umgestaltet. Dies führte dazu, dass meine EUnit-Tests mit undef Nachrichten fehlschlugen, immer wenn etwas getestet wurde, das die Bibliotheksanwendung benötigte.Erlang EUnit Testmodul, das von einer Bibliotheksanwendung abhängt

Der Aufbau ist so etwas wie dieses:

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

-export([foo/0]). 

foo() -> "OH HAI". 

Dann

% 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() 

Dann werden die Unit-Tests für some_app:bar() scheitern. Ich führe sie mit rebar eunit skip_deps=true. Ich benutze skip_deps=true, weil meine Version einige Anwendungen von Drittanbietern (SQL, etc) verwendet.

Ich nehme an, dass die Tests fehlschlagen, weil EUnit die zu testende App ohne ihre Abhängigkeiten aufruft? Gibt es eine Möglichkeit, das zu beheben? Ich habe die APP-Datei konfiguriert, um die Abhängigkeit explizit zu deklarieren. Es funktioniert gut in der Veröffentlichung, und es ist jetzt für etwa einen Tag ohne Problem bereitgestellt, aber ich fühle mich viel besser, wenn ich die Tests erneut passieren lassen kann :)

(Ich könnte eine Spott-App verwenden Stub utils:foo/0, und ich kann sehen, wo das idiomatisch wäre ideal, aber das scheint in diesem Fall wie übertrieben, weil utils:foo/0 (sprich: es ist Gegenstück der realen Welt). einige wirklich einfache Sachen tut)

+0

Ich denke, das hat nichts mit EUnit selbst zu tun, sondern wie Rebar die Tests durchführt. Entweder, weil es die anderen Anwendungen einfach nicht kompiliert, wenn Sie skip_deps verwenden, oder weil es sie nicht zum Erlang-Codepfad hinzufügt, selbst wenn sie zuvor kompiliert wurden. – RichardC

+0

Ich denke, ich muss in die Rebar-Quelle graben, um diese herauszufinden:/I * denke * die 'skip_deps'-Flagge überspringt einfach die Komponententests im' deps'-Verzeichnis (das für 3rd-Party-Sachen verwendet wird). – dantswain

+0

Soweit ich das an der Rebar-Quelle erkennen kann, sagt 'skip_deps' nur Rebar, Anwendungen im' deps'-Verzeichnis zu überspringen. – dantswain

Antwort

1

Ich konnte dies zur Arbeit, indem Sie rebar compile eunit skip_deps=true tun.

Der Schlüssel ist, die compile drin zu haben und ich habe keine Ahnung warum. Ich vermute, dass der Kompilierschritt alle Module in den Speicher bekommt. Ich würde gerne eine gute Erklärung hören.

0

ich glaube, Sie könnten haben eine Ihrer Anwendungen das Dienstprogramm laden, indem es in der Anwendung Teil von Ihnen .app-Datei, wie in zB:

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

oder auf andere Weise fügen Sie es dem Pfad des Erlang-Knotens hinzu ... vielleicht mit dem Flag -pa beim Start des Knotens.

+1

Das Modul ist Teil einer anderen Anwendung. Es wird als eine Abhängigkeit in dem Abschnitt "Anwendungen" der APP-Datei aufgeführt. Der Abschnitt "Module" ist für Module, die von dieser App eingeführt werden, also nicht geeignet. Ich habe es trotzdem versucht und es hat immer noch nicht funktioniert. – dantswain