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


127

プロジェクト(GitHubのAngular Seedプロジェクトから取得)でデフォルトのサービスユニットテストを実行しようとしていますが、「モジュールが定義されていません」というエラーが発生し続けます。

参照されたJavaScriptファイルの順序に関係している可能性があることを読みましたが、動作しないようですので、あなたの1人が助けてくれるといいのですが。

テストの構成は次のようになります。

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;

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:モジュールが定義されていません


2
プロジェクトをどこかで共有できますか?お手伝いできるかもしれません。testacularのDEBUGレベルをオンにして、構成に基づいて実際にロードされているファイルを確認しようとしましたか?今のところ、疑わしい部分はこのパターンです:public / javascripts / lib / angular-.js-何に一致させる必要がありますか?
pkozlowski.opensource

@JohnDoeありがとうございました。回答を追加すると、解決済みとマークされます。その理由は、私がシードプロジェクトをフォローしていたからです。それが以前のバージョンだったからかどうかはわかりません。
Dofs 2012年

@Dofs「 'public / javascripts / lib / angular-.js'」および「 'public / controllers / .js'」のタイプミスはありますか?
Ryan O'Neill、

@ RyanO'Neillすみません、これはタイプミスでした。
Dofsは2013年

回答:


260

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


8
angular.moduleと同じでangular.mock.moduleないことに注意してください。window.module機能はの別名ですangular.mock.module。詳細については、この回答を参照してください。
Tim Schaub 2013年

以前のコメントにあるように、angular.moduleはangular.mock.moduleのエイリアスではありません。
Filippo De Luca

7
この回答は、そのファイルを提供する方法についてのアドバイスを提供する場合、はるかに役立ちます。Bower、次にNgMocksをインストールする必要がありました。
isherwood

4
答えはソリューションの一部のみを提供します。これは実際にはコメントであり、説明ではありません。以下の回答のいくつかは、はるかに詳細です。
Gerome Bochmann、2016年

1
初心者の場合angular-mocksは、karma.conf.jsファイルへの参照を追加し、JasmineではなくKarmaを介してテストを実行する必要があります。このように、Karmaが実行されると、angular-mocks拡張機能を取得して環境に組み込みます。
ルーク、

41

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


これは、ジャスミンJavaScriptファイルが角度モックの前に読み込まれるようにすることでも解決できます。ものを動作させるためにハックな変更を加えるよりもクリーンなソリューション。
foomip 2014年

@foomipハックな変更を加えることを提案したのは誰ですか?
Stephen

あなたは基本的にアプリにハックを挿入して、物事が正しい方法で読み込まれることを確認しました-私は悪い方法でハックすることを意味していませんでした(そのコードスニペットの記述方法に問題はありません)が、ジャスミンまたは他の何かに更新すると、そのスニペットが壊れるか、期待どおりに機能しなくなりますか?それは起こり得た、または起こらなかったが、それは今やあなたのコードの責任であり、避けられたのではないだろうか?
foomip '19年

@foomip:何を指しているのかわかりませんが、上記の私のコードの場合、これは私が作成したものではなく、単に問題を説明するために引用しています。コードは角度モックの一部です。修正は、単に一方のファイルをもう一方のファイルを参照するという問題です。
Antoine Jaussoin、2014年

36

window.module関数が入って来た角度-mocks.jsとの省略形ですangular.mock.moduledocsで述べたように、この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ドキュメントはかなり完全な例が含まれます。


おそらく注目に値するかもしれませんがmodule、モカにも対応しています
Robin-Hoodie 2016年

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


2
結論としては、角度モックが必要です。
エイドリアン

3

karma構成にangular-mocks.jsを含めましたが、それでもエラーが発生していました。ファイル配列では順序が重要であることがわかります。(duh)HTMLドキュメントのヘッドのように、スクリプトが定義される前にAngularを呼び出し、エラーが発生した場合。したがって、angular.jsとangular-mocks.jsの後にapp.jsを含める必要がありました。


0

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.