【问题标题】:Mocking Nested function calls in Jasmine在 Jasmine 中模拟嵌套函数调用
【发布时间】:2021-03-25 17:37:26
【问题描述】:

我目前正在尝试使用 Jasmine 测试我的打字稿功能:

//AB.ts

export async function A() {
}
export async function B() {
    A();
}

我试图通过模拟 A 来对函数 B 进行单元测试。我想看看是否调用了 A。这是我所拥有的:

//AB.spec.ts
import * as AB from './AB'

describe('AB has a function B that ', () => {
    it('calls A', async () => {
        let ASpy: jasmine.Spy;
        ASpy = spyOn(AB, 'A').and.returnValue(Promise.resolve({}));
        await AB.B();
        expect(ASpy).toHaveBeenCalled();
    });
});

当我运行这个测试时,我被告知从未调用过 ASpy。但是经过进一步调查,我发现肯定调用了 A 函数。所以似乎调用了 A 函数,但我为该函数创建的模拟没有被触发。我尝试在不同的文件中实现 A 函数并在 B 中调用它并在 AB.spec.ts 中模拟它;在这种情况下,测试通过,因为期望确定调用了 ASpy。 我不确定为什么将两个函数放在同一个文件中会破坏测试,但将它们放在单独的文件中会通过测试。无论如何,我希望尽快收到某人的来信!我可以将函数放在单独的文件中,但我想在以后的项目中尽可能避免它。

【问题讨论】:

    标签: typescript unit-testing jasmine spyon


    【解决方案1】:

    我看到你正在使用

    Aspy = spyOn(AB,'A'); 
    

    其中 AB 不是组件/类的对象,但它只是一个常量,用于将这些全局函数导入规范文件。

    因此,问题实际上不在于您用于专门测试“异步”函数的任何代码,而在于您为没有类/组件对象的函数创建间谍的方式。您可能想检查此线程并修改您的原始解决方案,以查看使用以下线程中的解决方案之一重新访问您的间谍是否允许您的原始测试运行良好..

    Using Jasmine to spy on a function without an object

    【讨论】:

    • 不幸的是,这并没有回答这个问题的关键,即为什么我不能在我的 B 单元测试中模拟出 A。
    • 是的,我可能冲动地提出了一些对我有用的建议。但无论如何,我正在编辑我的答案并提出更多建议。如果它解释了您的测试无法正常工作的原因,请告诉我。
    • @Sean 您是否碰巧检查了我在这篇文章中编辑的答案?我想你可能会发现它很有帮助。不过,我很想知道您是否能够确定根本原因。
    【解决方案2】:

    我能够找到一种在 B 中正确模拟 A 的方法。只需将 export 关键字添加到我的函数调用中:

    export async function B() {
        exports.A();
    }
    

    这允许 B 的范围看到 A 的定义,同时也允许 .spec 文件看到 A 正在尊重 A 的导出方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2021-03-09
      • 2021-10-18
      相关资源
      最近更新 更多