gpt4 book ai didi

javascript - 在将 Squire.js 与 RequireJS 和 Mocha 一起使用时,如何避免引入全局泄漏?

转载 作者:数据小太阳 更新时间:2023-10-29 04:44:30 26 4
gpt4 key购买 nike

我正在使用 Backbone 和 Backbone.Marionette 编写单页 JavaScript 应用程序。我正在使用 AMD 模块和 RequireJS 来帮助组织我的代码和管理依赖项。我也在使用 Mocha作为我的 TDD/BDD 测试框架。

一切正常,直到我想使用 Sinon.JS 引入 stub 、模拟和 spy 。经过大量搜索,我在 test frameworks in the RequireJS wiki 上找到了一个页面和 Squire.js ,这似乎很适合我的需要。但是,当我尝试使用 Squire.js 加载模块时,Mocha 突然报告模块依赖项的全局泄漏。如果我直接使用 Require.JS 加载模块,则没有泄漏报告。

例如,下面的测试代码不会导致 Mocha 报告任何泄漏:

define(['app/app'], function(app) {
describe('App', function() {
it('Should define a \'header\' region', function() {
expect(app.headerRegion).to.exist;
});

it('Should define a \'main\' region', function() {
expect(app.mainRegion).to.exist;
});
});

return {
name: "App"
};
});

但是,如下所示将代码转换为使用 Squire.js 会导致 Mocha 报告 jQuery、Backbone 和 Marionette(app.js 的依赖项)的泄漏:

define(['Squire'], function(Squire) {
describe('App', function() {

var testContext = {};

beforeEach(function(done) {
testContext.injector = new Squire();
testContext.injector.require(['app/app'], function(app) {
testContext.app = app;
done();
});
});

it('Should define a \'header\' region', function() {
expect(testContext.app.headerRegion).to.exist;
});

it('Should define a \'main\' region', function() {
expect(testContext.app.mainRegion).to.exist;
});
});

return {
name: "App"
};
});

我做错了什么?我很困惑,Mocha 没有报告 RequireJS 的泄漏,而是报告了 Squire.js 的泄漏。我还尝试了在另一个 StackOverflow question on mocking RequireJS dependencies 中找到的其他一些解决方案,例如自定义函数和 testr.js,先于 Squire.js,结果相似。迄今为止,我一直无法找到同时使用 Mocha、RequireJS 和 Sinon.JS 的示例。

我已经 placed my current code base on GitHub以防万一我遗漏了一些重要信息之类的。有问题的测试可以在 test\spec\test.app.js 中找到。 .

非常感谢任何帮助。我非常想摆脱对测试设置的胡闹,然后开始实际开发我的应用程序。提前致谢。

最佳答案

在进一步思考之后,我意识到这实际上是预期的行为,也是加载 app.js 进行测试时的副作用。

我的测试是通过 RequireJS 在如下所示的 require 语句中加载的

require([
'spec/test.smoketest',
'spec/test.app'
], runMocha);

runMocha 只是一个调用 mocha.run() 的函数。

我突然想到,Mocha 最有可能检测全局泄漏的方法是比较每次测试运行前后全局注册的内容。在上面的第一个示例中,未报告泄漏,jQuery、Backbone 和 Marionette 在调用 mocha.run() 之前由 RequireJS 加载,作为加载 test.app.js 模块的一部分。另一方面,在第二个示例中,jQuery、Backbone 和 Marionette 作为测试本身的一部分被加载。

因此,第一个配置不会报告任何泄漏,因为 jQuery、Backbone 和 Marionette 已经在 mocha.run() 被调用之前全局注册。第二种配置报告泄漏,因为它们是在测试期间注册的。

现在我明白了发生了什么并且这是预期的,我很乐意配置 Mocha 以允许这些全局对象。这可以在 Mocha 配置中完成,如下所示:

mocha.setup({
ui: "bdd",
globals:["_", "$", "jQuery", "Backbone", "Marionette"]
});

关于javascript - 在将 Squire.js 与 RequireJS 和 Mocha 一起使用时,如何避免引入全局泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251614/

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