【发布时间】:2016-06-13 03:51:21
【问题描述】:
我正在我的开发机器上运行 Karma/Jasmine/Angular 2.0 测试。就在最近,我的开发箱上的 Jasmine 决定开始运行我的测试 3 次。是的,每次正好 3 次。
在第一次运行时,一切都按预期进行。但是,在第二次和第三次通过时,所有相同的事情都失败了。它总是承认有 7 次测试,但运行 21 次,10 次失败(窗外一年级数学)????
这也是 fails on Travis 与 SauceLabs。 (注意:链接到旧版本,有 3 次测试,但运行 9 次,5 次失败???)
我有一个屏幕截图、karma.conf.js 文件和一个启动整个事情的套件。非常感谢任何帮助。
罪魁祸首 [TypeScript](删除这个并在我的开发盒上解决问题):
describe('From the Conductor Service', () => {
let arr: Array<ComponentStatusModel> = null;
let svc: ConductorService = null;
beforeEach(() => {
arr = [/* Inits the array*/];
svc = new ConductorService();
});
describe('when it is handed a container to hold objects which need to be loaded', () => {
// More passing tests...
/// vvvvv The culprit !!!!!
describe('then when you need to access the container', () => {
beforeEach(() => {
svc.loadedContainer = arr;
});
it('it should always be available', () => {
assertIsLocalDataInTheService(arr, svc.loadedContainer);
});
});
/// ^^^^^ End of culprit !!!!!
});
// More passing tests...
});
失败的测试:
浏览器截图:
不确定这是否相关,但在所有错误发生之前,Jasmine 调用堆栈较小(左侧,观察滚动条)。错误开始后,堆栈会随着重复调用相同的函数而变大(右,观察滚动条)。
套件堆栈错误:
在我的测试中,Nanobar 和 Conductor 规格文件是完全分开的。但是,您可以看到套件阵列包含来自 Nanobar 和 Conductor 规范的内容。 Jasmine 不知何故将这两个规范文件混合在一起(在一切开始失败之后),并导致我的 describe() 语句在发布到控制台时没有任何意义。
简化的 karma.conf.js:
module.exports = function (config) {
config.set({
autoWatch: false,
basePath: '.',
browsers: ['Chrome'],
colors: true,
frameworks: ['jasmine'],
logLevel: config.LOG_INFO,
port: 9876,
reporters: ['coverage', 'progress'],
singleRun: true,
coverageReporter: {
// Code coverage config
},
files: [
// Loads everything I need to work
],
plugins: [
'karma-chrome-launcher',
'karma-coverage',
'karma-jasmine'
],
preprocessors: {
'app/**/*.js': ['coverage']
},
proxies: {
// Adjust the paths
}
})
}
【问题讨论】:
-
您的样本并不能准确显示问题所在,但 99% 的情况下,当我遇到此类问题时,这是因为一项或多项测试具有“副作用”。基本上需要编写测试,以便
beforeEach部分从头开始构建所有内容。然后每个测试都可以独立运行并以任何顺序运行。如果您确实需要更改全局或其他类似变量,请使用afterEach再次将其删除。希望对您有所帮助! -
@drew_w 非常感谢您的建议。如果为了清楚起见,我包含整个规范会更有帮助吗?
-
老实说,您可能已经针对问题的核心发布了足够的详细信息。获得更准确答案的最佳选择是发布一个小提琴或类似的东西来证明这个问题。我知道这需要时间,但肯定会有所帮助。
-
@drew_w 我实际上在 GitHub 上有这个项目。如果有帮助,这里是规范:git.io/v2Kat(链接也在上面)
-
我刚遇到同样的问题,注意到如果在测试中实例化新管道或在测试前在
beforeEach中实例化新管道,它似乎会消失(例如导入外部库并在每次测试之前实例化它)。
标签: javascript angular unit-testing jasmine karma-runner