2012-11-09 4 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으로 돌리고있다. 내 릴리스에서는 타사 응용 프로그램 (SQL 등)을 사용하기 때문에 skip_deps=true을 사용하고 있습니다.

EUnit이 종속성없이 테스트중인 앱을 호출하기 때문에 테스트가 시작되지 않는다고 가정합니다. 이 문제를 해결할 방법이 있습니까? 종속성을 명시 적으로 선언하도록 .app 파일을 구성했습니다. 그것은 릴리스에서 잘 작동하고, 아무런 문제없이 지금은 약 1 일 동안 배포되었지만, 다시 테스트를 통과 할 수 있다면 훨씬 나아질 것입니다. :)

(나는 조롱 앱을 사용할 수 있습니다. utils:foo/0을 그루터기로 만들었는데, 그 부분이 관용적으로 이상적인지 알 수 있지만 utils:foo/0 (읽기 : 실물과 비슷합니다)은 정말 간단한 작업을 수행하기 때문에 잔인한 것처럼 보입니다.

+0

나는 이것이 EUnit 자체와 아무 관련이 없다고 생각하지만 Rebar가 테스트를 어떻게 수행하고 있는지 생각해보십시오. skip_deps를 사용할 때 단순히 다른 응용 프로그램을 컴파일하지 않기 때문에 또는 이전에 컴파일 된 경우에도 Erlang 코드 경로에 추가하지 않기 때문입니다. – RichardC

+0

철근 소스를 파헤쳐 야한다고 생각합니다./sk * skip_deps' 플래그는'deps' 디렉토리 (제 3 자의 물건에 사용되는)에서 단위 테스트를 건너 뛴다고 생각합니다. – dantswain

+0

철근 소스를 보면서 알 수있는 한, 'skip_deps'는 rebar가'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 파일의'applications' 섹션에 의존성으로 나열됩니다. 'modules' 섹션은 그 app에 의해 소개 된 모듈들을위한 것이므로 적당하지 않습니다. 나는 그것을 어떻게해서든지 시도했다. 그리고 그것은 아직도 일하지 않았다. – dantswain