最簡單的解決方案,我看到的是覆蓋全局的功能describe
和it
使他們接受第三個可選參數,它必須是一個布爾值或返回一個布爾函數 - 告訴電流是否套房/規格應該執行。當重寫時,我們應該檢查這個第三個可選參數是否解析爲true
,如果是,那麼我們稱之爲xdescribe
/xit
(或ddescribe
/iit
取決於Jasmine版本),這是Jasmine的方法來跳過suite/spec,而不是原始describe
/it
。該塊必須在測試之前執行,但Jasmine包含在頁面之後。在Karma中,只需將這些代碼移動到一個文件中,並將其包含在karma.conf.js
的測試文件之前。下面是代碼:
(function (global) {
// save references to original methods
var _super = {
describe: global.describe,
it: global.it
};
// override, take third optional "disable"
global.describe = function (name, fn, disable) {
var disabled = disable;
if (typeof disable === 'function') {
disabled = disable();
}
// if should be disabled - call "xdescribe" (or "ddescribe")
if (disable) {
return global.xdescribe.apply(this, arguments);
}
// otherwise call original "describe"
return _super.describe.apply(this, arguments);
};
// override, take third optional "disable"
global.it = function (name, fn, disable) {
var disabled = disable;
if (typeof disable === 'function') {
disabled = disable();
}
// if should be disabled - call "xit" (or "iit")
if (disable) {
return global.xit.apply(this, arguments);
}
// otherwise call original "it"
return _super.it.apply(this, arguments);
};
}(window));
和使用例如:
describe('foo', function() {
it('should foo 1 ', function() {
expect(true).toBe(true);
});
it('should foo 2', function() {
expect(true).toBe(true);
});
}, true); // disable suite
describe('bar', function() {
it('should bar 1 ', function() {
expect(true).toBe(true);
});
it('should bar 2', function() {
expect(true).toBe(true);
}, function() {
return true; // disable spec
});
});
See a working example here
我也偶然發現this issue其中的想法是加入鏈方法.when()
爲describe
和it
,這與我上面描述的幾乎相同。它看起來更好,但實施起來有點困難。
describe('foo', function() {
it('bar', function() {
// ...
}).when(anything);
}).when(something);
如果你是第二種方法很感興趣,我會很樂意與它一點點玩,嘗試實施連鎖.when()
。
更新:
茉莉花使用第三個參數爲超時選項(see docs),所以我的代碼示例替換該功能,這是不正常。我喜歡@milanlempera和@MarcoCI更好的回答,我的似乎有點hacky和不直觀。我會嘗試儘快更新我的解決方案,不要打破Jasmine默認功能的兼容性。
太好了。我用它來禁止fdescribe並適合構建env。只需重寫fdescribe和fit並拋出異常。 –