gpt4 book ai didi

node.js - 为什么在我的 karma Node 单元测试中没有定义 "exports"以及是什么阻止了 requirejs 按预期工作

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:43 28 4
gpt4 key购买 nike

我一直在尝试让单元测试适用于我的 Node 应用程序,并且我遵循了指南 here以及在 SO 和 Google 上搜索,我很不清楚我做错了什么,或者我正在尝试做的事情是否正确。

为了简单起见,我创建了自己的模块,它被称为 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 这样的 Node 模块时,我都会收到错误 Uncaught Error: Module name "mongoose"has not been loaded yet for context: _。使用 require([]) 。我试图以与我自己的模块相同的方式包含它,但没有运气,只是得到同样的错误。

我这样做完全错了吗?我真正希望能够做的是以与使用它们相同的方式测试我的自定义模块,即在我的测试文件中,我将执行如下操作:

var myModule = require("./myModule");
var value = myModule.mul(3,4)
expect(value).toBe(12)

显然,在测试中使用 define 如果有效的话会很好,但我还需要能够测试“需要”其他模块的模块。如果可能的话,我宁愿不必为每个间接需要的模块手动更新 karma 配置或 test-main(即,如果我正在测试模块 a 并且它需要模块 band 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 是浏览器测试的测试运行器, Node 测试不需要它。

关于node.js - 为什么在我的 karma Node 单元测试中没有定义 "exports"以及是什么阻止了 requirejs 按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21483176/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com