我一直在努力让单元测试为我的节点应用程序工作,我已经按照这里的指南进行搜索,并在搜索引擎优化和谷歌搜索,我不清楚我做错了什么或者我想要做的是什么对.
为简单起见,我创建了自己的模块,说它被调用myModule.js
并包含:
exports.mul = function (a, b){ return a * b; };
我已经设置了我的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 }); };
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 });
这是我的测试文件:
define(['app', 'jquery', 'underscore', 'myModule'], function(App, $, _, myModule) { describe('just checking', function() { it('test My Module', function (){ expect(myModule.mul(2,2)).toBe(4); }); }); });
问题是我一直在收到错误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)
显然在测试中使用define会很好,如果它工作但我还需要能够测试"需要"其他模块的模块.如果可能的话,我宁愿不必手动更新每个间接需要的模块的karma配置或test-main(例如,如果我正在测试模块a并且它需要模块带c我会期望更新Karma配置有关模块a但不是b或c或b或c所要求的任何模块的信息
我几乎没有使用Grunt,但如果这是解决所有这些问题的方法,请随意指出我朝这个方向或类似方向.
任何帮助,建议或有用的链接都会非常感激,如果由于某些原因这在Karma中是不可能的,那么我是否可以使用另一个框架(最好是使用Jasmine的框架).
这是CommonJS模块定义:
exports.mul = function (a, b){ return a * b; };
您正在使用Require.js,因此您应该使用AMD模块定义:
define(function (){ return { mul : function (a, b){ return a * b; } }; });
此外,karma
是浏览器测试的测试运行器,您不需要它进行节点测试.