jon*_*nie 4 unit-testing node.js jasmine gruntjs karma-runner
我一直在努力让单元测试为我的节点应用程序工作,我已经按照这里的指南进行搜索,并在搜索引擎优化和谷歌搜索,我不清楚我做错了什么或者我想要做的是什么对.
为简单起见,我创建了自己的模块,说它被调用myModule.js并包含:
exports.mul = function (a, b){
return a * b;
};
Run Code Online (Sandbox Code Playgroud)
我已经设置了我的Karma init以允许requirejs查看配置文件和test-main.js
karma.config.js :
// Karma configuration
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine', 'requirejs'],
files: [
{pattern: 'lib/**/*.js', included: false},
{pattern: 'src/**/*.js', included: false},
{pattern: 'test/**/*Spec.js', included: false},
'test/test-main.js',
],
exclude: [
'src/main.js'
],
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
captureTimeout: 60000,
singleRun: false
});
};
Run Code Online (Sandbox Code Playgroud)
test-main.js
var tests = [];
for (var file in window.__karma__.files) {
if (/Spec\.js$/.test(file)) {
tests.push(file);
}
}
requirejs.config({
// Karma serves files from '/base'
baseUrl: '/base/src',
paths: {
'jquery': '../lib/jquery',
'underscore': '../lib/underscore',
'myModule' : 'myModule',
},
shim: {
'underscore': {
exports: '_'
}
},
// ask Require.js to load these files (all our tests)
deps: tests,
// start test run, once Require.js is done
callback: window.__karma__.start
});
Run Code Online (Sandbox Code Playgroud)
这是我的测试文件:
define(['app', 'jquery', 'underscore', 'myModule'], function(App, $, _, myModule) {
describe('just checking', function() {
it('test My Module', function (){
expect(myModule.mul(2,2)).toBe(4);
});
});
});
Run Code Online (Sandbox Code Playgroud)
问题是我一直在收到错误Uncaught ReferenceError: exports is not defined at C:/myProject/src/myModule.js:1.
此外,每当我尝试要求像mongoose这样的节点模块时,我都会收到错误Uncaught Error: Module name "mongoose" has not been loaded yet for context: _. Use require([]).我试图以与我自己的模块相同的方式包含它,但没有运气,只是得到相同的错误.
我这样做完全错了吗?我真正想做的是测试我的自定义模块,就像我使用它们一样,即在我的测试文件中,我会做如下的事情:
var myModule = require("./myModule");
var value = myModule.mul(3,4)
expect(value).toBe(12)
Run Code Online (Sandbox Code Playgroud)
显然在测试中使用define会很好,如果它工作但我还需要能够测试"需要"其他模块的模块.如果可能的话,我宁愿不必手动更新每个间接需要的模块的karma配置或test-main(例如,如果我正在测试模块a并且它需要模块带c我会期望更新Karma配置有关模块a但不是b或c或b或c所要求的任何模块的信息
我几乎没有使用Grunt,但如果这是解决所有这些问题的方法,请随意指出我朝这个方向或类似方向.
任何帮助,建议或有用的链接都会非常感激,如果由于某些原因这在Karma中是不可能的,那么我是否可以使用另一个框架(最好是使用Jasmine的框架).
这是CommonJS模块定义:
exports.mul = function (a, b){
return a * b;
};
Run Code Online (Sandbox Code Playgroud)
您正在使用Require.js,因此您应该使用AMD模块定义:
define(function (){
return {
mul : function (a, b){
return a * b;
}
};
});
Run Code Online (Sandbox Code Playgroud)
此外,karma是浏览器测试的测试运行器,您不需要它进行节点测试.