128

私のプロジェクト (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' ];

autoWatch = true;

ブラウザ = ['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: モジュールが定義されていません

4

7 に答える 7

260

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

于 2012-11-15T15:15:10.527 に答える
41

私は同じ問題を抱えていましたが、それが機能しない理由を理解しました: jasmine.js javascriptは angular-mocks.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 を参照するだけです。

于 2013-08-06T08:24:59.553 に答える
36

このwindow.module関数はangular-mocks.jsに含まれており、angular.mock.module. docsで述べたように、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ドキュメントには、かなり完全な例が含まれています。

于 2013-01-05T01:27:08.190 に答える
11

ユニットテストでは「angular」なしで「module」を使用し、正常に動作します。

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を介して実行されています)

于 2012-11-15T03:49:39.873 に答える
3

カルマ設定に angular-mocks.js を含めましたが、まだエラーが発生していました。files 配列では順序が重要であることがわかりました。(duh) HTML ドキュメントの head と同じように、スクリプトが定義される前に angular を呼び出すと、エラーが発生します。そのため、angular.js と angular-mocks.js の後に app.js を含める必要がありました。

于 2014-05-30T21:53:21.907 に答える
0

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

于 2014-10-31T09:01:03.193 に答える