是的,這是有點hacky,但完全有可能。
我們需要做的第一件事是使Jasmine.Env類可用。就我個人而言,我已經在我的SpecRunner.html中完成了它,因爲無論如何它已經設置了它。在我SpecRunner的負載我有一個運行以下腳本:
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var trivialReporter = new jasmine.TrivialReporter();
jasmineEnv.addReporter(trivialReporter);
jasmineEnv.specFilter = function(spec) {
return trivialReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
};
})();
所以execJasmine函數聲明之後我推jasmineEnv到全局命名空間中加入這樣的:
this.jasmineEnv = jasmineEnv;
現在,在我的任何spec文件中,我都可以訪問jasmineEnv變量,這就是包含matchers核心代碼的東西。
特別注意toEqual,toEqual調用jasmine.Env.prototype.equals_函數。這意味着,在您的customMatcher,你可以做到以下幾點:
beforeEach(function(){
this.addMatchers({
isJasmineAwesome : function(expected){
return jasmineEnv.equals_(this.actual, expected);
}
});
});
不幸的是,使用這種方法只會讓您使用以下方法:
- compareObjects_
- equals_
- contains_
其餘的匹配者駐留在jasmine.Matchers類,但我沒有b能夠讓公衆瞭解。我希望這可以幫助你在某個方面或另一個
真棒,謝謝!這可能是我尋找的解決方案(您提供的解決方案)比我試圖避免的問題(我自己的對象相等檢查器)更糟的情況。儘管如此,非常酷。 – Fishtoaster
如果您想在另一個自定義匹配器B中使用自定義匹配器A,則可以將匹配器A的邏輯添加到jasmine.Env.prototype,然後使用jasmine.getEnv從匹配器B中調用該日誌).myMatcherFn()。 –