Angular jasmine spyOn函数的实现原理

121 阅读1分钟

例子:

语义:希望service.findFirstFocusable方法被监控,同时其调用之后,返回el变量。

  • 输入参数1:MockkeyboardFocusService
  • 输入参数2:字符串findFirstFocusable

这两个参数去调用spyRegistry.spyOn方法。

首先要判断MockkeyboardFocusService这个对象里确实有findFirstFocusable方法:

如果这个对象已经有and和calls属性,说明已经被spied了:

其中and指向spy strategy,calls指向调用监控器 tracker.

把原始方法的备份存储到originalMethod里:

调用SpyFactory创建spy:

customerSpyStrategy是空的:

基于原始函数创建一个wrapper:


函数调用的监控器tracker:

给wrapper即spied之后的函数添加and和calls属性:

被spy之前:

被spy之后:

更多Jerry的原创文章,尽在:“汪子熙”: