問題
テスト環境をセットアップしようとしたときに、同様の問題が発生しました。私はこのようなファイル構造を持っていました:
myApp/
src/
js/
app.js
data.js
lib/underscore.js
test/
karma.conf.js
test-main.js
matchers.js
spec/
data.js
ここで注意が必要です。私のアプリスクリプト(app.js
および)は、、などに解決されるRequireJSdata.js
構成を想定しているため、テスト環境でもその構成が必要です。data
src/js/data.js
lib/underscore
src/js/lib/underscore.js
test/test-main.js
-----------------
require.config({
// Karma serves files under /base, which is the basePath from your config file
baseUrl: '/base/src/js',
// ...
});
これで、テストを作成できます。
test/spec/data.js
-----------------
define(['data', '../../test/matchers'], function(dataModule) {
describe('The data module', function() {
it('should satisfy my custom matcher', function() {
expect(dataModule).toSatisfyMyCustomMatcher();
});
});
});
一部のカスタムマッチャーの場合:
test/matchers.js
----------------
define([], function() {
beforeEach(function() {
this.addMatchers({
toSatisfyMyCustomMatcher: function() {
return this.actual.isGood;
},
});
});
});
しかし、その'../../test/matchers'
部分はひどく醜いです。テスト仕様は、他のモジュールへのファイルパスを知ることに悩まされるべきではありません-それはRequireJSの仕事です。代わりに、シンボリック名を使用します。
ソリューション
RequireJSパス構成は、ディレクトリをマップすることもできます。
パスマッピングはディレクトリ用である可能性があるため、モジュール名に使用されるパスには拡張子を含めないでください。
したがって、解決策は単純なパス構成です。
test/test-main.js
-----------------
require.config({
baseUrl: '/base/src/js',
paths: {
test: '../../test',
},
// ...
});
test
これで、ディレクトリをbaseUrl
:の子であるかのように参照できます。
test/spec/data.js
-----------------
define(['data', 'test/matchers'], function(dataModule) {
// ...
});
私の場合、これは、複数のを持っている場合とほとんど同じように効果的に出てきますbaseUrl
。