使用 Jasmine 监视 TypeScript 中没有对象的非导入函数

Using Jasmine to spy on a non-imported function without an object in TypeScript

我了解发生了什么:Using Jasmine to spy on a function without an object and why it doesn't work in TypeScript. I also see this TypeScript answer: 。

不幸的是,这只能解决导入的监视函数的情况。我正在测试一个接受函数的函数,我试图查看传入的函数是否使用正确的参数调用。

import { chowDown } from './file.ts';

interface Taco {
  filling: string;
  hasCheese: boolean;
  isCrispy: boolean;
}

describe('chowdown', () => {
  const eatTaco = (taco: Taco) => {};
  const expectedTaco = {filling: 'ground beef', hasCheese: false, isCrispy: true};

  it('eats the taco', () => {
    chowdown(eatTaco);
    expect(eatTaco).toHaveBeenCalledWith(expectedTaco);
  });
});

我想做的是

spyOn(eatTaco);
//or
spyOn(window, 'eatTaco');
我在网上找到的

None 个提议的解决方案实际上适用于这种罕见的间谍事件。有没有人知道如何正确地监视 eatTaco

谢谢

好的,我明白了。

eatTaco 的声明必须从这里更改:

  const eatTaco = (taco: Taco) => {};

对此:

  const eatTaco = jasmine.createSpy();

这仍然适用于 TypeScript,而且 Jasmine 足够聪明,可以正确处理 toHaveBeenCalledWith(...) 而无需打字。你在这里确实失去了一点类型安全,但只要你在实际代码中声明了类型——你的测试在技术上不需要它。

用以下间谍替换 eatTaco 函数:

const eatTaco = jasmine.createSpy<(taco: Taco) => void>();

这个 TypeScript 泛型让你输入安全。