【问题标题】:RequireJS and MochaRequireJS 和 Mocha
【发布时间】:2017-08-28 08:50:13
【问题描述】:

我有一个使用 RequireJS 的网络应用程序。这是我的js/main.js 文件:

require.config({
    baseUrl: 'js/',
    paths: {
        jquery: 'libs/jquery/jquery',
        lodash: 'libs/lodash/lodash',
        backbone: 'libs/backbone/backbone',
        // [other dependencies...]
    }
});

require(['views/AppView'], function (AppView) {
    var app_view = new AppView;
});

这是我的js/views/AppView.js 文件:

define([
    'jquery',
    'underscore',
    'backbone',
    'joint',
    'views/ProjectView',
    'models/Command',
    'views/detailsview',
    'views/newcellview'
], function ($, _, Backbone, joint, ProjectView, Command, DetailsView, NewCellView) {
    var app_view = {stub: 'stub'};
    return app_view;
});

最后是我的AppViewTest.js 文件,我使用mocha js/test/AppViewTest.js 运行:

var assert = require('assert');
var requirejs = require('requirejs');

describe('AppView', function() {
    var app_view;
    beforeEach(function (done) {
        requirejs(['../views/AppView.js'], function (AppView) {
            app_view = new AppView;
        });
    });
    it('should be [...]', function() {
        assert.equal(app_view, ...);
    });
});

我收到以下错误:

1) AppView views "before each" hook:
   Uncaught Tried loading "jquery" at /usr/local/lib/node_modules/mocha/bin/jquery.js then tried node's require("jquery") and it failed with error: Error: Cannot find module 'jquery'

【问题讨论】:

  • 我已编辑您的问题以删除不再相关的信息,只保留对您当前问题重要的信息。

标签: javascript testing dependencies requirejs mocha.js


【解决方案1】:

您开始测试:

var assert = require('assert');
var requirejs = require('requirejs');

然后你开始调用requirejs,但这里没有配置RequireJS的东西。

如果您将 main.js 中的 require.config 调用剪切并粘贴到您的测试文件中,这会将您的测试配置为加载与常规应用程序中相同的文件。

另一种方法是:

before(function (done) {
    requirejs(['full-path-to/main'], function () {
        requirejs(['../views/AppView'], function (AppView) {
            app_view = new AppView;
            done();
        });
    });
});

重点是在加载 AppView 之前加载配置。另请注意,您需要调用done,并且我已将beforeEach 更改为before,因为无需在每次测试之前重新加载它。 (我之前诱导你使用beforeEach时,是我的一个误会。我的错。)

我还从您的requirejs 通话中删除了.js,因为您不应该使用.js。有时它是有保证的,但除非你能解释为什么你需要它,否则你不应该使用它。

【讨论】:

  • 这可能解决了问题。实际上,我仍然得到一个错误,但这次它似乎与 JQuery 特别有关:Uncaught Error: Evaluating ./libs/jquery/jquery.js as module "jquery" failed with error: TypeError: Cannot read property 'createElement' of undefined
  • 是的,jQuery 需要有一个 DOM 环境才能运行。 Mocha 标记中有大量问题涉及在测试期间向 jQuery 提供 DOM。
  • 我明白了:createDocument() 是一种 DOM 方法,我正在使用 Node,所以也许我必须为 document DOM 元素创建一个存根。
  • 太好了,非常感谢您的帮助。我认为这实际上解决了问题,所以我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多