在 Jasmine 中模拟嵌套函数调用
Mocking Nested function calls in Jasmine
我目前正在尝试使用 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 中模拟它;在这种情况下,测试通过,因为 expect 确定调用了 ASpy。
我不确定为什么将这两个函数放在同一个文件中会破坏测试,但将它们放在单独的文件中会通过测试。不管怎样,我希望很快能收到别人的来信!我可以将函数放在单独的文件中,但我想在以后的项目中尽可能避免它。
我看到你正在使用
Aspy = spyOn(AB,'A');
其中 AB 不是组件的对象/class,但它只是您用来将这些全局函数导入规范文件的常量。
所以问题实际上不在于您用于专门测试“异步”功能的任何代码,而在于您在没有 class / 组件对象的情况下为您的功能创建间谍的方式。您可能想检查此线程并修改您的原始解决方案,以查看是否使用以下线程中的一种解决方案重新访问您的间谍,让您的原始测试 运行 正常..
Using Jasmine to spy on a function without an object
我找到了一种在 B 中正确模拟 A 的方法。只需要将 exports 关键字添加到我的函数调用中:
export async function B() {
exports.A();
}
这允许 B 的作用域看到 A 的定义,同时也允许 .spec 文件看到 A 尊重 A 的导出方法。
我目前正在尝试使用 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 中模拟它;在这种情况下,测试通过,因为 expect 确定调用了 ASpy。 我不确定为什么将这两个函数放在同一个文件中会破坏测试,但将它们放在单独的文件中会通过测试。不管怎样,我希望很快能收到别人的来信!我可以将函数放在单独的文件中,但我想在以后的项目中尽可能避免它。
我看到你正在使用
Aspy = spyOn(AB,'A');
其中 AB 不是组件的对象/class,但它只是您用来将这些全局函数导入规范文件的常量。
所以问题实际上不在于您用于专门测试“异步”功能的任何代码,而在于您在没有 class / 组件对象的情况下为您的功能创建间谍的方式。您可能想检查此线程并修改您的原始解决方案,以查看是否使用以下线程中的一种解决方案重新访问您的间谍,让您的原始测试 运行 正常..
Using Jasmine to spy on a function without an object
我找到了一种在 B 中正确模拟 A 的方法。只需要将 exports 关键字添加到我的函数调用中:
export async function B() {
exports.A();
}
这允许 B 的作用域看到 A 的定义,同时也允许 .spec 文件看到 A 尊重 A 的导出方法。