programing

Angular returns 모듈의 테스트 서비스가 정의되지 않았습니다.

i4 2023. 3. 22. 20:44
반응형

Angular returns 모듈의 테스트 서비스가 정의되지 않았습니다.

프로젝트에서 기본 서비스 유닛 테스트를 실행하려고 하는데(GitHub의 Angular Seed 프로젝트에서 가져옴) "module is not defined"라는 오류가 계속 나타납니다.

참조된 JavaScript 파일의 순서와 관련이 있을 수 있다고 읽었습니다만, 제대로 동작하지 않는 것 같기 때문에, 어느 쪽이라도 도움이 될 수 있으면 좋겠다고 생각합니다.

테스트 설정은 다음과 같습니다.

basePath = '../';

[files = 。
'public/cripts/lib/jquery-1.8.2.199',
sublic.', publicsublicascripts/lib/sublic.html',
'public/cripts/lib/cripts-.cripts',
'public/app.cripts',
'public/controllers/.cripts',

'public/directions.directions',
public/publichtml',
public/services.filename',

JASSIN_ADAPTER JASSIN_ADAPTER,
'public/cripts/lib/cripts.mocks',
/ unit / 'test / unit / *.filename';

autoWatch = 참;

브라우저 = ['크롬'];

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');
    }));
  });
});

테스트 실행 시 오류는 다음과 같습니다.

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

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

저도 같은 문제가 있었는데 왜 작동하지 않는지 알 수 있었습니다.angular-mocks.js 파일 전에 jasmine.js javascript를 참조해야 합니다.실제로 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를 참조해 주세요.

window.module함수는 angular-mocks.syslog로 제공되며 의 줄임말입니다.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'가 없는 'module'을 사용하고 있으며, 정상적으로 작동합니다.

Coffee Script:

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

어느 쪽인가

JavaScript:

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

testacular.conf.js 파일에서 angular-mocks.js 파일이 'module'을 사용하려는 사양보다 먼저 files 섹션에 나열되지 않은 경우에만 설명하신 오류와 같은 오류가 나타납니다.테스트 후에 '파일' 목록에 저장하면

ReferenceError: Can't find variable: module

(우리의 테스트는 팬텀을 통해 실행됩니다.JS)

카르마 설정에 angular-mocks.js를 포함했는데도 오류가 발생하고 있었습니다.파일 배열에서는 순서가 중요한 것으로 나타났습니다.(duh) html doc의 머리글과 마찬가지로 스크립트가 정의되기 전에 angular를 호출하여 오류가 발생할 경우.그래서 angular.js와 angular-mocks.js 뒤에 app.js를 넣어야 했어요.

Yeoman이랑 각도 생성기를 사용한다면 아마 이 오류가 날 거예요.특히 튜토리얼( ._)을 실행할 때는 더욱 그렇습니다.
bower_components/angular-mocks dir에서 test/mock dir로 angular-mocks.js 파일을 복사하여 수정했습니다.물론 카르마.conf.js 파일이 올바르게 설정되어 있는지 확인해야 합니다.
반가워요!

제가 이런 걸 할 때도 같은 문제가 있었어요var module = angular.module('my',[])IIFE에 둘러싸여 있는지 확인해야 했어요

언급URL : https://stackoverflow.com/questions/13334749/testing-service-in-angular-returns-module-is-not-defined

반응형