web-dev-qa-db-ja.com

Angular戻り値モジュールのテストサービスが定義されていません

私のプロジェクトでデフォルトのサービスユニットテストを実行しようとしています(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_ADAPTER、
'public/javascripts/lib/angular-mocks.js'、
'test/unit/*。js'];

autoWatch = true;

browsers = ['Chrome'];

junitReporter = {outputFile: 'test_out/unit.xml'、suite: '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:モジュールが定義されていません

126
Dofs

angular-mocks.jsファイルがありません。

259
John Doe

私は同じ問題を抱えていて、それがなぜ機能しなかったのかを理解しました:jasmine.js javascript BEFOREで参照する必要があります angle-mocks.jsファイル。実際、angular-mocks.jsはJasmineがロードされているかどうかを確認し、ロードされている場合にのみモジュール関数をウィンドウに追加します。

これはextract of Angular Mocksコードです:

(以下にある「ハッキング」に関するいくつかのコメントの後に編集します:これはコードの抜粋であり、これはあなたが自分で書く必要のあるものではなく、すでにあります!)

window.jasmine && (function(window) {

[...]

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

簡単に言うと:jasmine.jsを参照するだけですbefore angular-mocks.jsを実行してください。

40

window.module関数は angular-mocks.js で提供され、angular.mock.moduleの省略形です。 ドキュメント で述べたように、module関数はJasmineでのみ機能します。

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 docs にはかなり完全な例が含まれています。

35
Tim Schaub

ユニットテストでは「角度」なしで「モジュール」を使用し、正常に動作します。

CoffeeScript:

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ファイルがリストされていない場合だけです。テストの後に「ファイル」リストに入れると、

ReferenceError: Can't find variable: module

(私たちのテストはPhantomJSを介して実行されています)

11
Ryan O'Neill

カルマ設定にangle-mocks.jsを含めましたが、それでもエラーが発生していました。ファイル配列では順序が重要であることがわかります。 (duh)スクリプトが定義される前にangularを呼び出すと、エラーが発生します。したがって、angular.jsとangular-mocks.jsの後にapp.jsを含める必要がありました。

3
Erik

var module = angular.module('my',[])のようなことをしているときに、同じ問題が発生しました。 IIFEに囲まれていることを確認する必要がありました

0
Jackie

Yeomanとその角度ジェネレーターを使用している場合、おそらくこのエラーが発生します。特にチュートリアルを行うとき(._。)
angle-mocks.jsファイルをbower_components/angular-mocks dirからtest/mock dirにコピーすることで修正しました。もちろん、karma.conf.jsファイルが正しく構成されていることを確認する必要があります。
ご挨拶!

0
alxU