为什么"导出"没有在我的业力节点单元测试中定义,以及什么阻止了requirejs按预期工作

 劲舞团之舞之精灵_559 发布于 2023-01-30 10:18

我一直在努力让单元测试为我的节点应用程序工作,我已经按照这里的指南进行搜索,并在搜索引擎优化和谷歌搜索,我不清楚我做错了什么或者我想要做的是什么对.

为简单起见,我创建了自己的模块,说它被调用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的框架).

1 个回答
  • 这是CommonJS模块定义:

    exports.mul = function (a, b){
        return a * b;
    };
    

    您正在使用Require.js,因此您应该使用AMD模块定义:

    define(function (){
        return {
            mul : function (a, b){
                return a * b;
            }
        };
    });
    

    此外,karma是浏览器测试的测试运行器,您不需要它进行节点测试.

    2023-01-30 10:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有