有些奇怪的javascript代码适用于所有主流浏览器,但使用phantomjs/qunit失败了
somewhat odd javascript code works in all major browsers, but fails with phantomjs/qunit
我开发了一个带有javascript/html前端和后端REST服务的应用程序。我主要从事后端服务,但我正在尝试将javascript单元测试添加到构建中。我有人帮我设置javascript测试框架,使用phantomjs、qunit和jstestrunner,所有这些都引用自Maven。
我为一个模块(我们称之为"data.dayly.js")写了一个琐碎的单元测试,它的开头是这样的:
Data.Daily = new Function();
Data.Daily.prototype = {
需要明确的是,这些代码每天都在生产中运行,并且在所有主要浏览器(FF、IE和Chrome)中都能正常工作。
测试如下:
requirejs.config({ shim: { 'data.daily': ['config'] } });
require(['data.daily'], function() {
'use strict';
module('data.daily');
test('data.daily.test.initialize', function() {
var dataDaily = new Data.Daily();
dataDaily.initialize(Config.AJAX_DAILY_DATA_BASE_URL, Config.MOCKDATA_AJAX_DAILY_DATA_BASE_URL);
deepEqual(dataDaily.getData(), {}, "object is '"" + JSON.stringify(dataDaily.getData()) + "'", but it should be empty object");
});
});
当我运行此测试时,它失败如下:
ReferenceError: Can't find variable: Data, source: http://localhost:9080/data.daily.js:5
[data.daily] data.daily.test.initialize: failed: 1 passed: 0
Died on test #1 at http://localhost:9080/js/qunit.js:425
at http://localhost:9080/js/data.daily.test.js:17
at http://localhost:9080/js/require.js:1682
at http://localhost:9080/js/require.js:983
at http://localhost:9080/js/require.js:1194
at http://localhost:9080/js/require.js:129
at http://localhost:9080/js/require.js:1237
at each (http://localhost:9080/js/require.js:58)
at http://localhost:9080/js/require.js:1238
at http://localhost:9080/js/require.js:1043
at http://localhost:9080/js/require.js:1224
at http://localhost:9080/js/require.js:882
at callGetModule (http://localhost:9080/js/require.js:1249)
at http://localhost:9080/js/require.js:1578
at http://localhost:9080/js/require.js:1703: Can't find variable: Data, source: ReferenceError: Can't find variable: Data
我能找到的唯一方法是用这种方式更改"data.dayly.js",在现有行之前添加一行:
var Data = {};
Data.Daily = new Function();
Data.Daily.prototype = {
现在我不得不说,这在我看来是合乎逻辑的,但事实仍然是,现有的代码在所有主要的浏览器中都能很好地工作。此代码只有在从测试中引用时才开始失败。
请注意,我还尝试更改测试脚本,在"vardataDaily=newData.Daily()"行之前添加了"varData={}"行,但没有效果。
那么,有人能解释一下这里发生了什么吗?如果原始代码在测试中失败,为什么它能工作。"require.js"是如何工作的,是不是有什么奇怪的东西让这种情况发生了?为什么测试不通过在测试中添加行而不是CUT(测试中的代码)来工作?
好的,我已经解决了这个问题。
该赋值实际上存在于现有的生产代码中,我只是以前没有想过在".html"文件中查找它。当我在".js"文件中找不到它时,我以为发生了其他事情。
将该行放入测试脚本中不起作用的原因是我将该行放错了位置。错误实际上发生在配置时,而不是在执行测试时,因此赋值必须在"requirejs.config()"调用之前。现在测试工作了,无需修改CUT。
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 我如何才能让CasperJS和PhantomJS在约塞米蒂玩得很好
- PhantomJS - 检查javascript函数是否正在运行的任何方法
- PhantomJS重影驱动程序停止
- “;出口;在PhantomJS中定义
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- 一台特定计算机的Ajax请求数据未定义/失败
- 有些奇怪的javascript代码适用于所有主流浏览器,但使用phantomjs/qunit失败了
- PhantomJS和pjscrape-在某些多个URL上失败
- Require在PhantomJs测试中失败
- XMLHttpRequest在phantomjs中异步失败
- 实例化模块ngSanitize"失败;使用PhantomJS预渲染angalrjs站点时
- Jasmine测试在Chrome和Firefox中通过,但在PhantomJS中失败
- QUnit测试在Travis CI上失败(在phantomjs上运行grunt.js)