gpt4 book ai didi

javascript - 通过 Jasmine 测试时,RequireJS 模块垫片不起作用

转载 作者:行者123 更新时间:2023-11-28 07:03:24 25 4
gpt4 key购买 nike

我有一个JavaEE project使用 RequireJS 加载一些第三方框架。 OpenLayers3 就是其中之一。 Openlayers3 native 创建一个全局“ol”变量。然而,OpenLayers3 被编写为与 AMD 兼容,并通过 RequireJS 作为模块工作。我也在使用 OpenLayers3 plugin称为“olLayerSwitcher”,它未针对 AMD 进行优化。相反,它依赖于全局的“ol”变量。

我的要求配置如下所示:

paths: {
"sinon": ['/webjars/sinonjs/1.7.3/sinon'],
"jquery": ["/webjars/jquery/2.1.4/jquery"],
"backbone": ['/webjars/backbonejs/1.2.1/backbone'],
"underscore": ['/webjars/underscorejs/1.8.3/underscore'],
"text": ['/webjars/requirejs-text/2.0.14/text'],
"log4js": ['/webjars/log4javascript/1.4.13/log4javascript'],
"ol": ['/webjars/openlayers/3.5.0/ol'],
"olLayerSwitcher": ['/js/vendor/ol3-layerswitcher/1.0.1/ol3-layerswitcher']
},
shim: {
"olLayerSwitcher": {
deps: ["ol"],
exports: "olLayerSwitcher"
},
'sinon' : {
'exports' : 'sinon'
}
}

该项目使用 Backbone 并包含 Router 模块 (/src/main/webapp/js/controller/AppRouter.js):

/*jslint browser : true*/
/*global Backbone*/
define([
'backbone',
'utils/logger',
'views/MapView'
], function (Backbone, logger, MapView) {
"use strict";
var applicationRouter = Backbone.Router.extend({
routes: {
'': 'mapView'
},
initialize: function () {
this.LOG = logger.init();
this.on("route:mapView", function () {
this.LOG.trace("Routing to map view");

new MapView({
mapDivId: 'map-container'
});
});
}
});

return applicationRouter;
});

路由器模块依赖于 View 模块(/src/main/webapp/js/views/MapView.js):

/*jslint browser: true */
define([
'backbone',
'utils/logger',
'ol',
'utils/mapUtils',
'olLayerSwitcher'
], function (Backbone, logger, ol, mapUtils, olLayerSwitcher) {
"use strict";

[...]

initialize: function (options) {
this.LOG = logger.init();
this.mapDivId = options.mapDivId;
this.map = new ol.Map({

[...]

controls: ol.control.defaults().extend([
new ol.control.ScaleLine(),

new ol.control.LayerSwitcher({
tipLabel: 'Switch base layers'
})
])
});

Backbone.View.prototype.initialize.apply(this, arguments);
this.render();
this.LOG.debug("Map View rendered");
}
});

return view;
});

View 模块尝试引入 OpenLayers3 以及第三方 OpenLayers 插件。

构建并部署项目后,它在浏览器中运行良好。加载 View 模块后,OpenLayers 和第三方插件就会正常加载,并且一切都会正确渲染。

但是,当我尝试在 Jasmine 中测试这一点时,所有这些都崩溃了。

对于 Jasmine,我使用 Jasmine-Maven 插件。它引入 JasmineJS、PhantomJS 和 RequireJS 以及我的库并运行我的规范。问题是,当通过 Jasmine 运行时,MapView 模块尝试加载 OpenLayers3 库以及第三方插件 (olLayerSwitcher),但由于第三方插件找不到“ol”而失败。

测试:

define([
"backbone",
"sinon",
'controller/AppRouter'
], function (Backbone, sinon, Router) {
describe("Router", function () {
beforeEach(function () {
this.router = new Router();
this.routeSpy = sinon.spy();
this.router.bind("route:mapView", this.routeSpy);

try {
Backbone.history.start({silent: true});
} catch (e) {
}
this.router.navigate("elsewhere");
});

it("does not fire for unknown paths", function () {
this.router.navigate("unknown", true);
expect(this.routeSpy.notCalled).toBeTruthy();
});

it("fires the default root with a blank hash", function () {
this.router.navigate("", true);
expect(this.routeSpy.calledOnce).toBeTruthy();
expect(this.routeSpy.calledWith(null)).toBeTruthy();
});
});
});

Jasmine 的错误:

[ERROR - 2015-08-08T21:27:30.693Z] Session [4610ead0-3e14-11e5-bb2b-dd2c4b5c2c7b] - page.onError - msg: ReferenceError: Can't find variable: ol

:262 in error
[ERROR - 2015-08-08T21:27:30.694Z] Session [4610ead0-3e14-11e5-bb2b-dd2c4b5c2c7b] - page.onError - stack:
global code (http://localhost:58309/js/vendor/ol3- layerswitcher/1.0.1/ol3-layerswitcher.js:9)

:262 in error
JavaScript Console Errors:

* ReferenceError: Can't find variable: ol

第 9 行 ol3-layerswitcher 插件的相关部分是:

[...]
ol.control.LayerSwitcher = function(opt_options) {
[...]

所以这确实取决于“ol”此时是否存在。

Jasmine-Maven 插件创建自己的规范运行器 HTML,相关部分如下所示:

<script type="text/javascript">
if(window.location.href.indexOf("ManualSpecRunner.html") !== -1) {
document.body.appendChild(document.createTextNode("Warning: Opening this HTML file directly from the file system is deprecated. You should instead try running `mvn jasmine:bdd` from the command line, and then visit `http://localhost:8234` in your browser. "))
}

var specs = ['spec/controller/AppRouterSpec.js'];

var configuration = {
paths: {
"sinon": ['/webjars/sinonjs/1.7.3/sinon'],
"jquery": ["/webjars/jquery/2.1.4/jquery"],
"backbone": ['/webjars/backbonejs/1.2.1/backbone'],
"underscore": ['/webjars/underscorejs/1.8.3/underscore'],
"text": ['/webjars/requirejs-text/2.0.14/text'],
"log4js": ['/webjars/log4javascript/1.4.13/log4javascript'],
"ol": ['/webjars/openlayers/3.5.0/ol'],
"olLayerSwitcher": ['/js/vendor/ol3-layerswitcher/1.0.1/ol3-layerswitcher']
},
shim: {
"olLayerSwitcher": {
deps: ["ol"],
exports: "olLayerSwitcher"
},
'sinon' : {
'exports' : 'sinon'
}
}
};

if (!configuration.baseUrl) {
configuration.baseUrl = 'js';
}

if (!configuration.paths) {
configuration.paths = {};
}

if (!configuration.paths.specs) {
var specDir = 'spec';
if (!specDir.match(/^file/)) {
specDir = '/'+specDir;
}
configuration.paths.specs = specDir;
}

require.config(configuration);

require(specs, function() {
jasmine.boot();
});

我能够创建客户 HTML 运行程序,但不确定问题是什么,所以我不知道需要更改哪些内容。

这似乎不是 PhantomJS 问题,因为我可以在浏览器中加载测试,并且遇到了同样的问题。

如果有人对这里可能发生的事情有任何想法,我将不胜感激。我真的不想破解第三方模块以将其转换为 RequireJS 模块,因为 Jasmine 测试是完全实现这一点的最后一步,而我完全被困在这里。

我正在使用 Jasmine 2.3.0 和 RequireJS 2.1.18

很抱歉没有提供更多链接,但这是一个新帐户,我没有足够的代表。

最佳答案

如果没有运行版本的设置,将很难找出问题所在。但是,如果您能够为 Maven 插件生成的 jasmine 自定义 SpecRunner.html,只需在 SpecRunner html 中包含 jasmine(/任何其他导致问题的库)即可 - <script src="/<path_to_lib>"> .

根据我的经验,让源代码中使用的库兼容 amd 并与其他用于测试设置的库很好地配合,通常不值得付出努力。

关于javascript - 通过 Jasmine 测试时,RequireJS 模块垫片不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31898801/

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