[英]How to match TypeScript optional parameter in Jasmine?
我正在重構 TypeScript 方法以添加具有默認值的可選參數。 重構方法是核心操作,調用核心函數的高級操作有很多。 預先存在的調用省略了新參數(因此使用默認值),而新的和重構的方法提供了新的參數值。 簡化版本如下所示:
export class Scratch {
coreOperation(mainArg: string, option: boolean = false) {
// ...
}
private midLevelOperation(mainArg: string) {
this.coreOperation(mainArg + '1');
}
highLevelOperation1(mainArg: string) {
this.midLevelOperation(mainArg);
this.coreOperation(mainArg + '2', true);
}
}
我還在更新更高級別操作的 Jasmine 測試。 我想斷言高級操作會導致使用某些參數調用核心操作。 測試大致如下所示:
describe('Scratch', () => {
let objectUnderTest: Scratch;
beforeEach(() => {
objectUnderTest = new Scratch();
spyOn(objectUnderTest, 'coreOperation');
});
describe('highLevelOperation1', () => {
it('should call core operation', () => {
objectUnderTest.highLevelOperation1('main');
expect(objectUnderTest.coreOperation).toHaveBeenCalledWith('main1', false);
expect(objectUnderTest.coreOperation).toHaveBeenCalledWith('main2', true);
});
});
});
問題是 Jasmine 的toHaveBeenCalledWith
不知道第二個參數有默認值。 上述代碼的錯誤:
- Expected spy coreOperation to have been called with:
[ 'main1', false ]
but actual calls were:
[ 'main1' ],
[ 'main2', true ].
顯然,我可以通過從測試中刪除false
參數來通過測試。 但我不希望測試知道調用站點是使用 1 個參數還是 2 個參數,尤其是來自像這個示例這樣的私有庫函數。
有沒有辦法編寫一個在省略可選參數和傳遞默認值時都可以工作的 Jasmine 匹配器?
不幸的是,沒有辦法監視 Jasmine 中的默認/可選參數。
這是不可能的,有幾個原因:
arguments
數組變量中,它們不是傳遞給參數的實際值。toHaveBeenCalledWith
只能測試調用該方法的參數,而不是該方法決定將其缺少的參數默認為哪些值。 要解決此問題,您可以將目標方法包裝在另一個包含option: boolean = false
默認參數。 然后您應該能夠檢查調用coreOperation
的內容:
coreOperation(mainArg: string, option: boolean) {
// ...
}
private coreOperationDefaultWrapper(mainArg: string, option: boolean = false) {
this.coreOperationmainArg(mainArg, option);
}
值得注意的是,最好的測試是測試應用程序做了什么而不是測試它是如何編寫的。 因此,我強烈建議練習測試默認參數會導致什么行為的心態,而不是檢查它們實際上是什么。 當然這並不總是可能的,我希望上面的例子可以幫助你! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.