试图测试require模块返回undefined任何东西

时间:2014-10-20 18:37:34

标签: javascript requirejs mocha

我是单元测试的新手,但我尝试了很多方法来加载我的脚本(需要模块),以便与我的mocha测试脚本一起使用。无论我做什么,当我尝试阅读属性或函数或任何时,我总是得到不确定。任何人都可以帮助指出可能导致这种情况的原因吗?

rmq.js (要测试的脚本)

define(['bx_slider/1/bx_slider'], {

    ...

    ansrTotal: 0,

    ...

    init: function(settings) {
        var self = this;

        // do some stuff

        return self;
    }
});

测试bootstrap.js

require.config({
    paths: {
        'chai': '/node_modules/chai/chai',
        'bx_slider/1/bx_slider': '/test/lib/bx_slider'
    },
    baseUrl: '/',
    nodeRequire: require
});

mocha.setup({
    ui: 'bdd'
});

require(['test/test'], function() {

    if (window.mochaPhantomJS) {
        mochaPhantomJS.run();
    } else {
        mocha.run();
    }

});

test.js

define(['chai'], function(chai) {

    var expect = chai.expect;
    var rmq = require(['../src/js/rmq']);

    describe('rmq test suite', function() {

        before(function() {
            return rmq.init();
        });

        it('should blah', function() {

            expect(rmq.ansrTotal).to.equal(0);

        });

    });

});

如果有帮助,我的目录结构是

.
/node_modules
/src
    /js
        rmq.js
/test
    /lib
        bx_slider.js
        require.js
    test-bootstrap.js
    test.js

我的CLI中的确切错误(我目前在此处编写和发布的内容)是

Testing: test/test.js
rmq test suite
    "before all" hook
    'undefined' is not a function (evaluating 'rmq.init()')

1 个答案:

答案 0 :(得分:0)

正如评论中提到的Mathletics,您可以这样做:

define(['chai', '../src/js/rmq'], function(chai, rmq) {

如果出于某种原因,你不能这样做,那就有了另一种选择。 (也许你在问题中简化了你的代码,原因不再明显。)

define(['chai'], function(chai) {

    var expect = chai.expect;

    describe('rmq test suite', function() {
        var rmq;
        before(function (done) {
            require(['../src/js/rmq'], function (_rmq) {
                // Save the module we got to the `rmq` variable.
                rmq = _rmq;
                // Init and call `done` when finished.
                rmq.init().then(done);
            });
        });

        it('should blah', function() {

            expect(rmq.ansrTotal).to.equal(0);

        });

    });

});

我假设rmq.init()返回了一个承诺,因为您在代码中执行了return rmq.init(),除非rmq.init()返回一个承诺,否则这样做是没有意义的。如果情况并非如此,则您必须致电rmq.init(),然后再致电done()

您拥有的代码无法正常工作,因为require(['../src/js/rmq'])使模块异步,因此它不会返回模块。你必须像我上面所示的那样使用它。