[英]Does Jasmine's toThrow matcher require the argument to be wrapped in an anonymous function?
https://github.com/pivotal/jasmine/wiki/Matchers上的文檔包括以下內容:
expect(function(){fn();}).toThrow(e);
正如在討論這個問題 ,下面不起作用,因為我們想通過一個函數對象expect
,而不是調用的結果fn()
expect(fn()).toThrow(e);
問題1:以下工作如何?
expect(fn).toThrow(e);
問題2:如果我用方法doIt
定義了一個對象的thing
,下面的工作是否正常?
expect(thing.doIt).toThrow(e);
(2a:如果是這樣,有沒有辦法將參數傳遞給doIt
方法?)
根據經驗,答案似乎是肯定的,但我不相信我對js范圍的理解足以確定。
謝謝!
我們可以使用在ECMAScript 5中引入的Function.bind
來取消匿名函數包裝器。 這適用於最新版本的瀏覽器,您可以通過自己定義功能來修補舊瀏覽器。 Mozilla開發者網絡提供了一個示例定義。
這是一個如何bind
與Jasmine一起使用的示例。
describe('using bind with jasmine', function() {
var f = function(x) {
if(x === 2) {
throw new Error();
}
}
it('lets us avoid using an anonymous function', function() {
expect(f.bind(null, 2)).toThrow();
});
});
提供給bind
的第一個參數在調用f
時用作this
變量。 調用時,任何其他參數都會傳遞給f
。 這里2
被作為第一個也是唯一的參數傳遞。
讓我們來看看Jasmine的源代碼 :
try {
this.actual();
} catch (e) {
exception = e;
}
if (exception) {
result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
}
這是toThrow
方法的核心部分。 因此,所有方法都是執行您期望的方法並檢查是否拋出了異常。 所以在你的例子中, fn
或thing.doIt
將在Jasmine中調用,檢查是否拋出了錯誤,以及此錯誤的類型是否是您傳遞給toThrow
錯誤類型。
可悲的是,似乎如果我需要測試一個帶參數的函數,那么我需要用函數包裝它。
我寧願有首選,
expect(myTestFunction, arg1, arg2).toThrow();
但我明確地做了
expect(function(){myTestFunction(arg1, arg2);}).toThrow("some error");
僅供參考,我們也可以在錯誤時使用正則表達式匹配:
expect(function (){myTestFunction(arg1, arg2);}).toThrowError(/err/);
如果它像這樣使用:
expect(myTestFunction(arg)).toThrowAnyError(); // incorrect
然后函數myTestFunction(arg)
在expect(...)
之前執行,並在Jasmine有機會做任何事情之前拋出異常並且它會導致測試崩潰導致自動失敗。
如果函數myTestFunction(arg)
沒有拋出任何東西(即代碼沒有按預期工作),那么Jasmine只會得到函數的結果並檢查錯誤 - 這是不正確的。
為了緩解這種情況,預計會拋出錯誤的代碼應該包含在函數中。 這將傳遞給Jasmine,它將執行它並檢查預期的異常。
expect(() => myTestFunction(arg)).toThrowAnyError(); // correct
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.