- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 Jasmine (+Karma + Webpack) 时遇到问题
我将测试范围缩小到 beforeEach
语句,而不是在运行 it
block 之前等待执行 done()
回调。
编辑: Navjot Ahuja 指出 jasmine-node 在 beforeEach
中的 setTimeout
存在问题,因此我将其更改为使用 promises , 与他的建议略有不同(作为他的作品,但这个例子没有)
这是我发现的一些奇怪的事情:
spec
插件(或“点”)有关
beforeAll
它会起作用(但这不是一个选项)这是测试:
describe('Test', function () {
let flag = false;
describe('simple test -', function () {
beforeEach(function (done) {
console.log('SETTING TIMEOUT');
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
flag = true;
done();
}
};
xhttp.open('GET', 'https://api.github.com/zen', true);
xhttp.send();
});
it('should wait for done and set flag correctly', function () {
console.log('INSIDE IT STATEMENT');
expect(flag).toBe(true);
});
});
});
这是karma.conf.js
// Karma configuration
const webpackTestConfig = require('./build/tests.webpack.config.js');
module.exports = function (config) {
const webpackConfig = webpackTestConfig;
config.set({
client: {
args: [
`--ver=${config.ver}`,
`--region=${config.region}`,
`--env=${config.env}`
],
captureConsole: true
},
basePath: '',
frameworks: ['jasmine'],
files: [
'tests/integration/integrationTests.js'
],
reporters: ['spec', 'junit'],
junitReporter: {
useBrowserName: false,
outputFile: 'reports/js/unit-components/results/ITESTS-junit.xml'
},
coverageReporter: {
reporters: [
{type: 'text-summary', dir: 'reports/js/unit-components/coverage/text-summary/', subdir: '.'},
{type: 'lcov', dir: 'reports/js/unit-components/coverage/lcov/', subdir: '.'},
{type: 'html', dir: 'reports/js/unit-components/coverage/html', subdir: '.'},
{type: 'cobertura', dir: 'reports/js/unit-components/coverage/cobertura', subdir: '.'}
]
},
preprocessors: {
'tests/integration/integrationTests.js': ['webpack']
},
webpack: webpackConfig,
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
captureTimeout: 60000,
browserNoActivityTimeout: 600000,
singleRun: false
});
};
这是test.webpack.config.js
/*global __dirname*/
const webpackConfigBase = require('./webpack.config.js');
const path = require('path');
const _ = require('underscore');
const rootDir = path.resolve(__dirname, '..');
module.exports = () => {
const config = webpackConfigBase();
_.extend(config.resolve.alias, {
'integrationTests': path.join(rootDir, 'tests/integration'),
'testUtils': path.join(rootDir, 'tests/util'),
'testFixtures': path.join(rootDir, 'tests/fixture')
});
return config;
};
这是引用的基本 webpack 配置:
/* globals __dirname */
const path = require('path');
const rootDir = path.resolve(__dirname, '..');
function matchModule(resource, moduleName) {
return resource && resource.indexOf(moduleName) >= 0;
}
module.exports = () => ({
context: path.join(rootDir, 'www/latest/'),
entry: './app/api.js',
resolve: {
modules: [
path.join(rootDir, 'www/latest/app'),
path.join(rootDir, 'node_modules')
],
alias: {
'vendor': path.join(rootDir, 'www/latest/vendor')
// other paths here but removed
}
},
output: {
path: path.join(rootDir, 'www/latest/dist/'),
publicPath: 'CENSOREDPATH',
filename: 'api.js',
devtoolModuleFilenameTemplate: 'applicationname://[resource-path]',
devtoolFallbackModuleFilenameTemplate: 'applicationname://[resource-path]?[hash]'
},
module: {
rules: [
{
enforce: 'pre',
test: /\.js$/,
loader: 'eslint-loader'
},
{
test: /\.js$/,
exclude: function (resource) {
const es6Vendors = [
'vendor/censored/src',
'vendor/babel'
];
const isNodeModule = matchModule(resource, 'node_modules');
const isVendor = matchModule(resource, 'vendor');
const isEs6Vendor = (es6Vendors.filter(vendor => matchModule(resource, vendor)).length >= 1);
if (isNodeModule || (isVendor && !isEs6Vendor)) {
return true;
}
return false;
},
loader: 'babel-loader'
}
]
},
externals: {
'react/addons': true,
'react/lib/ExecutionEnvironment': true,
'react/lib/ReactContext': true
},
node: {
setImmediate: false,
clearImmediate: false
}
});
============================================= ==========================
这是控制台的输出:
Version: webpack 3.6.0
Time: 39ms
webpack: Compiled successfully.
webpack: Compiling...
06 10 2017 07:30:01.789:WARN [karma]: No captured browser, open http://localhost:9876/
Hash: 020b93689ec1147a0c3b
Version: webpack 3.6.0
Time: 70ms
Asset Size Chunks Chunk Names
tests/integration/integrationTests.js 3.96 kB 0 [emitted] tests/integration/integrationTests.js
[0] ./tests/integration/integrationTests.js 238 bytes {0} [built]
[1] ./tests/integration models\/item.spec.js$ 192 bytes {0} [built]
[2] ./tests/integration/specs/models/item.spec.js 612 bytes {0} [optional] [built]
webpack: Compiled successfully.
06 10 2017 07:30:01.799:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9876/
06 10 2017 07:30:01.800:INFO [launcher]: Launching browser Chrome with unlimited concurrency
06 10 2017 07:30:01.812:INFO [launcher]: Starting browser Chrome
06 10 2017 07:30:02.238:INFO [Chrome 61.0.3163 (Linux 0.0.0)]: Connected on socket mL2CqoCdzxFggtuIAAAA with id 72267743
Chrome 61.0.3163 (Linux 0.0.0) LOG LOG: '=================', './specs/models/item.spec.js', '================='
LOG LOG: 'SETTING TIMEOUT'
LOG LOG: 'INSIDE IT STATEMENT'
Test
simple test -
Test
simple test -
✗ should wait for done and set flag correctly
Expected false to be true.
at UserContext.<anonymous> (tests/integration/integrationTests.js:121:30)
✗ should wait for done and set flag correctly
Expected false to be true.
at UserContext.<anonymous> (tests/integration/integrationTests.js:121:30)
Chrome 61.0.3163 (Linux 0.0.0): Executed 2 of 1 (2 FAILED) ERROR (0.007 secs / 0.003 secs)
上述控制台错误中值得注意的错误是:
未捕获的类型错误:无法读取未定义的属性“ spy ”
Uncaught Error :试图完成错误的套件
以及完整的输出:
================= ./specs/models/item.spec.js =================
integrationTests.js:120 asdfasdf
debug.js:15 FAILED Test simple test - Test simple test - should wait for done and set flag correctly
debug.js:15 FAILED Test simple test - should wait for done and set flag correctly
2debug.js:6 Skipped 0 tests
integrationTests.js:120 asdfasdf
debug.js:21 Uncaught Expected false to be true.
at UserContext.<anonymous> (http://karma.vg.censored.com/base/tests/integration/integrationTests.js:121:26)
(anonymous) @ debug.js:21
setTimeout (async)
(anonymous) @ debug.js:20
window.__karma__.result @ debug.js:23
KarmaReporter.specDone @ adapter.js:243
dispatch @ jasmine.js:4366
(anonymous) @ jasmine.js:4337
specResultCallback @ jasmine.js:1175
complete @ jasmine.js:530
(anonymous) @ jasmine.js:4231
channel.port1.onmessage @ jasmine.js:1774
debug.js:21 Uncaught Expected false to be true.
at UserContext.<anonymous> (http://karma.vg.censored.com/base/tests/integration/integrationTests.js:121:26)
(anonymous) @ debug.js:21
setTimeout (async)
(anonymous) @ debug.js:20
window.__karma__.result @ debug.js:23
KarmaReporter.specDone @ adapter.js:243
dispatch @ jasmine.js:4366
(anonymous) @ jasmine.js:4337
specResultCallback @ jasmine.js:1175
complete @ jasmine.js:530
(anonymous) @ jasmine.js:4231
channel.port1.onmessage @ jasmine.js:1774
jasmine.js:1024 Uncaught TypeError: Cannot read property 'spies' of undefined
at currentSpies (jasmine.js:1024)
at SpyRegistry.clearSpies (jasmine.js:4848)
at clearResourcesForRunnable (jasmine.js:818)
at Spec.specResultCallback [as resultCallback] (jasmine.js:1173)
at QueueRunner.complete [as onComplete] (jasmine.js:530)
at jasmine.js:4231
at MessagePort.channel.port1.onmessage (jasmine.js:1774)
currentSpies @ jasmine.js:1024
SpyRegistry.clearSpies @ jasmine.js:4848
clearResourcesForRunnable @ jasmine.js:818
specResultCallback @ jasmine.js:1173
complete @ jasmine.js:530
(anonymous) @ jasmine.js:4231
channel.port1.onmessage @ jasmine.js:1774
jasmine.js:1024 Uncaught TypeError: Cannot read property 'spies' of undefined
at currentSpies (jasmine.js:1024)
at SpyRegistry.clearSpies (jasmine.js:4848)
at clearResourcesForRunnable (jasmine.js:818)
at nodeComplete (jasmine.js:955)
at QueueRunner.onComplete (jasmine.js:5327)
at jasmine.js:4231
at MessagePort.channel.port1.onmessage (jasmine.js:1774)
currentSpies @ jasmine.js:1024
SpyRegistry.clearSpies @ jasmine.js:4848
clearResourcesForRunnable @ jasmine.js:818
nodeComplete @ jasmine.js:955
onComplete @ jasmine.js:5327
(anonymous) @ jasmine.js:4231
channel.port1.onmessage @ jasmine.js:1774
jasmine.js:951 Uncaught Error: Tried to complete the wrong suite
at nodeComplete (jasmine.js:951)
at QueueRunner.onComplete (jasmine.js:5327)
at jasmine.js:4231
at MessagePort.channel.port1.onmessage (jasmine.js:1774)
nodeComplete @ jasmine.js:951
onComplete @ jasmine.js:5327
(anonymous) @ jasmine.js:4231
channel.port1.onmessage @ jasmine.js:1774
jasmine.js:1024 Uncaught TypeError: Cannot read property 'spies' of undefined
at currentSpies (jasmine.js:1024)
at SpyRegistry.clearSpies (jasmine.js:4848)
at clearResourcesForRunnable (jasmine.js:818)
at QueueRunner.onComplete (jasmine.js:984)
at jasmine.js:4231
at MessagePort.channel.port1.onmessage (jasmine.js:1774)
currentSpies @ jasmine.js:1024
SpyRegistry.clearSpies @ jasmine.js:4848
clearResourcesForRunnable @ jasmine.js:818
(anonymous) @ jasmine.js:984
(anonymous) @ jasmine.js:4231
channel.port1.onmessage @ jasmine.js:1774
jasmine.js:2373 Uncaught Uncaught TypeError: Cannot read property 'spies' of undefined
我现在已经在这上面花了很多时间了,但一点头绪都没有,有人能给我建议吗?
最佳答案
我猜 jasmine-node 现在不支持超时(问题:https://github.com/mhevery/jasmine-node/issues/344)
您可以使用 promise 。像这样:
describe('Test', function() {
let flag = false;
let beforeEachPromise;
describe('simple test -', function() {
beforeEach(function(done) {
console.log('SETTING TIMEOUT');
beforeEachPromise = new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('TIMEOUT CALLBACK TRIGGERED');
flag = true;
done();
}, 2000);
})
});
it('should wait for done and set flag correctly', function() {
beforeEachPromise.then(function() {
expect(flag).toBe(true);
})
});
});
});
关于javascript - Jasmine beforeEach 不等待完成回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46604310/
从 Redis 获取消息时,onDone:(){print('done')} 从未起作用。 import 'package:dartis/dartis.dart' as redis show PubS
昨天我玩了一些vim脚本,并设法通过循环来对当前输入的内容进行状态栏预测(请参见屏幕截图(灰色+黄色栏))。 问题是,我不记得我是怎么得到的,也找不到我用于该vim魔术的代码片段(我记得它很简单):它
我尝试加载 bash_completion在我的 bash (3.2.25) 中,它不起作用。没有消息等。我在我的 .bashrc 中使用了以下内容 if [ -f ~/.bash_completio
我正在尝试构建一个 bash 完成例程,它将建议命令行标志和合适的标志值。例如在下面 fstcompose 命令我想比赛套路先建议 compose_filter= 标志,然后建议来自 [alt_seq
当我尝试在重定向符号后完成路径时,bash 完成的行为就好像它仍在尝试在重定向之前完成命令的参数一样。 例如: dpkg -l > /med标签 通过在 /med 之后点击 Tab我希望它完成通往 /
我的类中有几个 CAKeyframeAnimation 对象。 他们都以 self 为代表。 在我的animationDidStop函数中,我如何知道调用来自哪里? 是否有任何变量可以传递给 CAKe
我有一个带有 NSDateFormatter 的 NSTextField。格式化程序接受“mm/dd/yy”。 可以自动补全日期吗?因此,用户可以输入“mm”,格式化程序将完成当前月份和年份。 最佳答
有一个解决方案可以使用以下方法完成 NSTextField : - (NSArray *)control:(NSControl *)control textView:(NSTextView *)tex
我正在阅读 Passport 的文档,我注意到 serialize()和 deserialize() done()被调用而不被返回。 但是,当使用 passport.use() 设置新策略时在回调函数
在 ubuntu 11.10 上的 Firefox 8.0 中,尽管 img.complete 为 false,但仍会调用 onload 函数 draw。我设法用 setTimeout hack 解决
假设我有两个与两个并行执行的计算相对应的 future 。我如何等到第一个 future 准备好?理想情况下,我正在寻找类似于Python asyncio's wait且参数为return_when=
我正在寻找一种 Java 7 数据结构,其行为类似于 java.util.Queue,并且还具有“最终项目已被删除”的概念。 例如,应可以表达如下概念: while(!endingQueue.isFi
这是一个简单的问题。 if ($('.dataTablePageList')) { 我想做的是执行一个 if 语句,该语句表示如果具有 dataTablesPageList 类的对象也具有 menu
我用replaceWith批量替换了许多div中的html。替换后,我使用 jTruncate 来截断文本。然而它不起作用,因为在执行时,replaceWith 还没有完成。 我尝试了回调技巧 ( H
有没有办法调用 javascript 表单 submit() 函数或 JQuery $.submit() 函数并确保它完成提交过程?具体来说,在一个表单中,我试图在一个 IFrame 中提交一个表单。
我有以下方法: function animatePortfolio(fadeElement) { fadeElement.children('article').each(function(i
我刚刚开始使用 AndEngine, 我正在像这样移动 Sprite : if(pValueY < 0 && !jumping) { jumping =
我正在使用 asynctask 来执行冗长的操作,例如数据库读取。我想开始一个新 Activity 并在所有异步任务完成后呈现其内容。实现这一目标的最佳方法是什么? 我知道 onPostExecute
我有一个脚本需要命令名称和该命令的参数作为参数。 所以我想编写一个完成函数来完成命令的名称并完成该命令的参数。 所以我可以这样完成命令的名称 if [[ "$COMP_CWORD" == 1 ]];
我的应用程序有一个相当奇怪的行为。我在 BOOT_COMPLETE 之后启动我的应用程序,因此在我启动设备后它是可见的。 GUI 响应迅速,一切正常,直到我调用 finish(),按下按钮时,什么都没
我是一名优秀的程序员,十分优秀!