天天看點

Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理

第120行給handler.handleError方法注入spy後,第121行代碼flush HTTP Mock request會觸發handler.handleError(的wrap實作)調用。第123行代碼檢測該方法是否真正被調用過。

Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理

首先執行expect(handler.handleError), 給handler.handleError建立一個spec:

Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理

實際上調用currentRunnable的expect方法:

Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理

this指向spec,actual就是被wrap後的方法。使用expectationFactory根據工廠方法建立一個expectation:

Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理
Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理
Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理

執行matcherCompare:

Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理

以下這段檢查說明,調用toHaveBeenCalled的對象必須是一個spied method:

Angular jasmine單元測試架構裡expect.toHaveBeenCalled的工作原理

判斷一個方法是否是spy的邏輯也很簡單,使用instanceof: