【问题标题】:Access "global" mocha.js functions when using require.js使用 require.js 时访问“全局”mocha.js 函数
【发布时间】:2012-02-20 22:55:10
【问题描述】:

我将 Mocha.js 与优秀的 use shim 包括在一个基于 Require.js 的站点中。

在使用Require.js时如何访问Mocha声明的define()和it() BDD函数?

这是一个基本的代码示例:

test.js:

var mocha    = require('use!mocha')
  , testFile = require('testFile.js')

mocha.setup('bdd');
mocha.run();

testFile.js:

define(function(require) {
  // describe() and it() are not available
  describe('Book', function() {
    it('should have pages', function() {

    });
  });
});

在浏览器中运行时出现错误Uncaught ReferenceError: describe is not defined

我尝试了 window.describe 并尝试将 require('testFile.js') 移到 mocha.setup('bdd') 之后。我知道我错过了一些东西。可能以某种方式将上下文传递给 mocha。

【问题讨论】:

    标签: javascript requirejs mocha.js


    【解决方案1】:

    问题是describeit等全局函数是由mocha.setup()设置的。您可以在 mocha 导出之前使用 shim 配置的 init 属性调用 mocha.setup()

    requirejs.config({
      shim: {
        'mocha': {
          init: function () {
            this.mocha.setup('bdd');
            return this.mocha;
          }
        }
      }
    });
    
    require(['mocha', 'test/some_test'], function (mocha) {
      mocha.run();
    });
    

    测试文件需要 mocha。

    define(['mocha'], function (mocha) {    
      describe('Something', function () {
        // ...
      });
    });
    

    Shim 配置的init 属性是在RequireJS 2.1 中引入的。您也许可以使用exports 属性而不是initRequireJS 2.0

    【讨论】:

    • 对 Node 用户表示遗憾:'错误:Node 不支持 Shim 配置'
    • 这对我有用(requirejs+configfile+testem+mocha)
    • 也为我工作。非常感谢。
    【解决方案2】:

    我在 geddski 的 amd-testing examples 项目中找到了解决方案。

    而不是像这样在顶部包含测试文件和 mocha:

    define(['use!mocha', 'testFile'],
    function(Mocha, TestFile) {
      mocha.setup('bdd');
      mocha.run();
    });
    

    测试文件应该作为另一个 require 调用和 mocha.run() 嵌入回调中:

    define(['use!mocha'],
    function(Mocha) {
      mocha.setup('bdd');
    
      // Include the test files here and call mocha.run() after.
      require(['testFile'],
      function(TestFile) {
        mocha.run();
      });
    });
    

    【讨论】:

    • 另外,您需要在 it() 中传递 done 参数并在测试用例中调用 done()。否则你的测试可能会抛出一个错误,但 mocha 会声称它通过了。
    • 呸!这仍然是最好的解决方案吗?
    • Ethan - 我希望有更好的解决方案。如果您确实找到了,请发布另一个答案!
    • 我的解决方案是不在我的 RequireJS 构建中设置 Mocha / Chai 作为依赖项。它最终太复杂了,到底是为了什么?我仍然使用 RequireJS 将我的所有测试构建到一个脚本中(并管理仅测试依赖项),但我现在假设我已经加载了应用程序、Mocha、Chai,然后是测试。您可以将这些作为参数传递给像 Testacular 这样的运行器,或者使用带有手动排序的脚本标签的测试运行器 HTML 页面。我觉得这是一个很好的折衷方案。
    • 请注意,我也总是会找到NestedDependencies,而且我不会从 CDN 加载脚本或使用“异步”样式要求...因此,根据您的具体情况,此解决方案可能适合您,也可能不适合您.
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多