为什么使用spyOn而不是jasmine.createSpy?

为什么使用spyOn而不是jasmine.createSpy?,jasmine,Jasmine,两者的区别是什么 jasmine.createSpy('someMethod')) 及 spyOn(someObject,“someMethod”) 为什么要选择使用间谍 我的猜测是,第一个备选方案将匹配方法someMethod,无论它包含在什么对象中,但spyOn仅在它包含在someObject中时匹配。从而使createSpy成为更通用的匹配器 不同之处在于,您应该在对象上使用spyOn const o = { some(): { console.log('spied') } }; spyO

两者的区别是什么

jasmine.createSpy('someMethod'))

spyOn(someObject,“someMethod”)

为什么要选择使用间谍


我的猜测是,第一个备选方案将匹配方法someMethod,无论它包含在什么对象中,但spyOn仅在它包含在someObject中时匹配。从而使createSpy成为更通用的匹配器

不同之处在于,您应该在对象上使用
spyOn

const o = { some(): { console.log('spied') } };
spyOn(o, 'some');
使用
createSpy()
为您的创建模拟方法时:

spyOn
的优点是您可以调用原始方法:

spyOn(o, 'some').and.callThrough();
o.some(); // logs 'spied'

正如@estus所说,在测试
spyOn
的情况下,原始方法会在测试后恢复。在重新分配时,应手动执行此操作。

除了其他精细答案之外:

  • 使用
    spyOn()
    监视(截获)对象上的现有方法,以跟踪其他模块对该对象的调用
  • 使用
    jasmine.createSpy()
    创建一个函数,该函数可以作为回调或处理程序传递以跟踪回调

更重要的是,如果是
spyOn
,测试后会恢复原始方法。当使用
o.some=
@EstusFlask重新分配它时,应该手动执行此操作。我只是想澄清一下您的陈述,当使用
spyOn
时,在it()执行后,它将恢复spied方法的原始实现?@ajgo它不会,除非您处理它-您需要这样做,因为这是一个好的实践。restoreAllMocks和restoreMocks配置选项对此负责。这是否意味着spyOn将不会在测试执行结束时释放?顺便说一句,我不是在开玩笑……我用的是因果报应茉莉花
spyOn(o, 'some').and.callThrough();
o.some(); // logs 'spied'