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:

Angular jasmine单元测试框架里expect.toHaveBeenCalled的工作原理

之前spied method被调用之后,在calls数组里插入了一条数据,因此只要calls数组有元素,都认为spied methhod已经被call过了:

Angular jasmine单元测试框架里expect.toHaveBeenCalled的工作原理
Angular jasmine单元测试框架里expect.toHaveBeenCalled的工作原理

更多Jerry的原创文章,尽在:“汪子熙”:
Angular jasmine单元测试框架里expect.toHaveBeenCalled的工作原理

上一篇:DIV+CSS静态HTML网页设计模板


下一篇:[Unit test] jasmine createSpyObj