【问题标题】:Why use spyOn instead of jasmine.createSpy?为什么使用 spyOn 而不是 jasmine.createSpy?
【发布时间】:2018-06-21 01:15:10
【问题描述】:

有什么区别

jasmine.createSpy('someMethod')

spyOn(someObject, 'someMethod')

为什么要选择使用 spyOn?

我的猜测是,第一个替代方法将匹配方法 someMethod,无论它包含在什么对象中,但 spyOn 仅在它包含在 someObject 中时才会匹配。从而使 createSpy 只是一个更通用的匹配器?

【问题讨论】:

    标签: jasmine


    【解决方案1】:

    不同的是你应该在对象上有一个方法spyOn

    const o = { some(): { console.log('spied') } };
    spyOn(o, 'some');
    

    当使用createSpy() 为您创建模拟方法时:

    const o = {};
    o.some = jasmine.createSpy('some');
    

    spyOn的好处是可以调用原方法:

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

    正如@estus 所说,在spyOn 的情况下,测试后将恢复原始方法。这应该在重新分配时手动完成。

    【讨论】:

    • 更重要的是,在spyOn的情况下,测试后恢复原始方法。这应该在使用o.some = 重新分配时手动完成。
    • @EstusFlask 只是想澄清一下你的说法,当使用spyOn 时,it() 执行后会恢复被窥探方法的原始实现吗?
    • @ajgo 它不会,除非你照顾它 - 你需要,因为这是一个很好的做法。 jest.restoreAllMocks 和 restoreMocks 配置选项负责。
    • 这是否意味着 spyOn 在测试执行结束时不会取消监听?顺便说一句,我不是在开玩笑……我用的是业力茉莉
    【解决方案2】:

    除了其他很好的答案:

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

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2021-10-12
      相关资源
      最近更新 更多