각도 반환 모듈의 테스트 서비스가 정의되지 않았습니다


127

내 프로젝트 (GitHub의 Angular Seed 프로젝트에서 가져온)에서 기본 서비스 단위 테스트를 실행하려고하는데 "모듈이 정의되지 않았습니다"라는 오류가 계속 발생합니다.

참조 된 JavaScript 파일 의 순서와 관련이있을 수 있지만 작동하지 않는 것 같습니다. 그래서 도움이 될 수 있기를 바랍니다.

테스트 구성은 다음과 같습니다.

basePath = '../';

파일 = [
''public / javascripts / lib / jquery-1.8.2.js ',
'public / javascripts / lib / angular.js ',
'public / javascripts / lib / angular- .js ',
'public / app.js ',
'public / controllers /
.js ',
'public / directives.js ',
'public / filters.js ',
'public / services.js ',
JASMINE,
JASMINE_ADAPTER,
'public / javascripts / lib / angular-mocks. js ',
'test / unit / *. js '];

자동 감시 = true;

브라우저 = [ 'Chrome'];

junitReporter = {outputFile : 'test_out / unit.xml', 제품군 : 'unit'};

서비스는 다음과 같습니다.

angular.module('myApp.services', []).
  value('version', '0.1');

테스트는 다음과 같습니다.

'use strict';

describe('service', function() {
  beforeEach(module('myApp.services'));


  describe('version', function() {
    it('should return current version', inject(function(version) {
      expect(version).toEqual('0.1');
    }));
  });
});

그리고 testacular를 통해 테스트를 실행할 때의 오류는 다음과 같습니다.

ReferenceError : 모듈이 정의되지 않았습니다


2
어딘가에서 프로젝트를 공유 할 수 있습니까? 내가 도울 수 있을지도 모른다. testacular가 DEBUG 레벨을 켜서 실제로 구성에 따라 어떤 파일이로드되는지 확인 했습니까? 현재 의심스러운 부분은 다음과 같습니다. public / javascripts / lib / angular-.js-일치해야하는 것은 무엇입니까?
pkozlowski.opensource

@JohnDoe 감사합니다. 답변을 추가하면 해결 된 것으로 표시됩니다. 그 이유는 내가 씨앗 프로젝트를 따르고 있었기 때문입니다. 그것이 이전 버전 이었기 때문에 나는 모르겠다.
Dofs

@Dofs " 'public / javascripts / lib / angular-.js'"및 " 'public / controllers / .js'"오타입니까?
Ryan O'Neill

@ RyanO'Neill 죄송합니다. 오타였습니다.
Dofs

답변:


260

angular-mocks.js 파일 이 없습니다 .


8
그 참고 angular.module하고 angular.mock.module있다 되지 같은. 이 window.module함수는의 별칭입니다 angular.mock.module. 자세한 내용은 이 답변 을 참조하십시오 .
Tim Schaub

이전 의견에서 언급했듯이 angular.module은 angular.mock.module의 별칭이 아닙니다.
Filippo De Luca

7
이 답변은 해당 파일을 제공하는 방법에 대한 조언을 제공하면 훨씬 유용합니다. Bower를 설치 한 다음 NgMocks를 설치해야했습니다.
isherwood

4
답은 솔루션의 일부만을 제공합니다. 이것은 실제로 주석이며 설명이 아닙니다. 아래 답변 중 일부가 훨씬 자세합니다.
Gerome Bochmann

1
초보자 angular-mockskarma.conf.js파일에 참조를 추가하고 Jasmine이 아닌 Karma를 통해 테스트를 실행해야합니다. 이렇게하면 Karma가 실행될 때 angular-mocks확장을 선택 하여 환경에 통합합니다.
누가

41

나는 같은 문제가 있었고 왜 작동하지 않는지 이해했다 . angular-mocks.js 파일 전에 jasmine.js 자바 스크립트 를 참조해야 합니다. 실제로 angular-mocks.js는 Jasmine 이로 드되었는지 확인하고 모듈 기능이 창에 추가되는지 확인합니다.

Angular Mocks 코드 의 추출 은 다음과 같습니다 .

(아래에있는 '해킹'에 대한 몇 가지 주석 후에 편집하십시오 : 이것은 코드의 추출에 불과합니다.이 코드는 스스로 작성해야 할 것이 아닙니다.

window.jasmine && (function(window) {

[...]

  window.module = angular.mock.module = function() {
    var moduleFns = Array.prototype.slice.call(arguments, 0);
    return isSpecRunning() ? workFn() : workFn;
    /////////////////////
    [...]
  };

간단히 말해서 : angular-mocks.js 전에 jasmine.js 참조 하면됩니다.


또한 mockular-mock 전에 jasmine 자바 스크립트 파일을로드하여 해결할 수 있습니다. 작업을 수행하기 위해 해킹을 변경하는 것보다 깨끗한 솔루션.
foomip

@foomip 누가 해키 변경을 제안 했습니까?
Stephen

본질적으로 앱에 해킹을 삽입하여 올바른 방식으로로드되도록합니다. 그리고 나쁜 방법으로 해킹을 의미하지는 않았습니다 (코드 조각을 작성한 방식에는 아무런 문제가 없습니다). 재스민이나 다른 것으로 업데이트하면 스 니펫이 깨지거나 더 이상 예상대로 작동하지 않습니까? 그것은 일어날 수 있거나 일어날 수 없지만, 그것은 피할 수있는 코드의 책임입니다. 그렇지 않습니까?
foomip

@foomip : 나는 당신이 무엇을 말하는지 잘 모르겠지만, 위의 코드에 관한 것이면, 이것은 내가 작성한 것이 아니라 문제를 설명하기 위해 인용 한 것입니다. 코드는 각도 모의의 일부입니다. 수정은 단순히 한 파일을 다른 파일보다 먼저 참조하는 것입니다.
Antoine Jaussoin

36

window.module함수는 angular-mocks.js로 제공되며 의 약어입니다 angular.mock.module. 에서 언급 한 바와 같이 워드 프로세서module기능은 재스민 작동합니다.

Testacular를 사용 하면 다음 예제 구성 파일이로드 angular-mocks.js됩니다.

/** example testacular.conf.js */

basePath = '../';
files = [
  JASMINE,
  JASMINE_ADAPTER,
  'path/to/angular.js',
  'path/to/angular-mocks.js',   // for angular.mock.module and inject.
  'src/js/**/*.js',             // application sources
  'test/unit/**/*.spec.js'      // specs
];
autoWatch = true;
browsers = ['Chrome'];

그리고 다른 곳에서 제안한 것처럼 디버그 로깅으로 Testacular를 실행하여로드 된 스크립트를 확인할 수 있습니다 (검사기에서도 동일하게 볼 수 있음).

testacular --log-level debug start config/testacular.conf.js

angular.mock.inject문서는 꽤 완전한 예제를 포함한다.


아마도 module이제 mocha 와도 작동 한다는 점에 주목할 가치가 있습니다
Robin-Hoodie

11

단위 테스트에서 'angular'없이 'module'을 사용하면 정상적으로 작동합니다.

CoffeeScript :

describe 'DiscussionServicesSpec', ->
    beforeEach module 'DiscussionServices'
    beforeEach inject ... etc.

어떤 컴파일

자바 스크립트 :

describe('DiscussionServices', function() {
    beforeEach(module('DiscussionServices'));
    beforeEach(inject(function ... etc.

내가 설명 한 오류와 같은 것을 볼 수있는 유일한 시간은 testacular.conf.js 파일에서 angular-mocks.js 파일이 '모듈'을 사용하려고 시도하기 전에 파일 섹션에 나열되어 있지 않은 경우입니다. 테스트 후 '파일'목록에 넣으면 얻을 수 있습니다.

ReferenceError: Can't find variable: module

(우리의 테스트는 PhantomJS를 통해 실행됩니다)


2
결론은 각도 모의가 요구 사항이라는 것입니다.
Adrien

3

Karma 구성에 angular-mocks.js를 포함했지만 여전히 오류가 발생했습니다. 파일 배열에서 순서가 중요하다는 것이 밝혀졌습니다. (duh) html 문서의 헤드에서와 같이 스크립트가 정의되기 전에 각도를 호출하면 오류가 발생합니다. 그래서 방금 angular.js와 angular-mocks.js 뒤에 app.js를 포함시켜야했습니다.


0

Yeoman과 각 생성기를 사용하는 경우이 오류가 발생합니다. 특히 튜토리얼 (._.)
을 할 때 angular-mocks.js 파일을 bower_components / angular-mocks 디렉토리에서 test / mock 디렉토리로 복사하여 수정했습니다. 물론 karma.conf.js 파일이 올바르게 구성되어 있는지 확인해야합니다.
인사말!


0

내가 같은 일을 할 때도 같은 문제가있었습니다 var module = angular.module('my',[]). IIFE에 둘러싸여 있는지 확인해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.