问题
我在尝试设置测试环境时遇到了类似的问题。我有一个这样的文件结构:
myApp/
src/
js/
app.js
data.js
lib/underscore.js
test/
karma.conf.js
test-main.js
matchers.js
spec/
data.js
这就是它变得棘手的地方:我的应用程序脚本(app.js
和data.js
)假设 RequireJS 配置解析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
就我而言,这实际上与我可以拥有多个s几乎相同。