私のプロジェクトでデフォルトのサービスユニットテストを実行しようとしています(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:モジュールが定義されていません
angular-mocks.jsファイルがありません。
私は同じ問題を抱えていて、それがなぜ機能しなかったのかを理解しました: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を実行してください。
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 にはかなり完全な例が含まれています。
ユニットテストでは「角度」なしで「モジュール」を使用し、正常に動作します。
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を介して実行されています)
カルマ設定にangle-mocks.jsを含めましたが、それでもエラーが発生していました。ファイル配列では順序が重要であることがわかります。 (duh)スクリプトが定義される前にangularを呼び出すと、エラーが発生します。したがって、angular.jsとangular-mocks.jsの後にapp.jsを含める必要がありました。
var module = angular.module('my',[])
のようなことをしているときに、同じ問題が発生しました。 IIFEに囲まれていることを確認する必要がありました
Yeomanとその角度ジェネレーターを使用している場合、おそらくこのエラーが発生します。特にチュートリアルを行うとき(._。)
angle-mocks.jsファイルをbower_components/angular-mocks dirからtest/mock dirにコピーすることで修正しました。もちろん、karma.conf.jsファイルが正しく構成されていることを確認する必要があります。
ご挨拶!