如何处理模块和打字稿类型的玩笑模拟功能

新手上路,请多包涵

我使用 ts-jestjest 用打字稿编写我的测试文件。

我很困惑如何输入模块的模拟函数。

这是我的代码:

./module.ts :

 import {IObj} from '../interfaces';

const obj: IObj = {
  getMessage() {
    return `Her name is ${this.genName()}, age is ${this.getAge()}`;
  },

  genName() {
    return 'novaline';
  },

  getAge() {
    return 26;
  }
};

export default obj;

./module.test.ts

 import * as m from './module';

describe('mock function test suites', () => {

  it('t-1', () => {
    // I think the jest.Mock<string> type here is not correct.
    m.genName: jest.Mock<string> = jest.fn(() => 'emilie');
    expect(jest.isMockFunction(m.genName)).toBeTruthy();
    expect(m.genName()).toBe('emilie');
    expect(m.getMessage()).toEqual('Her name is emilie, age is 26');
    expect(m.genName).toHaveBeenCalled();

  });

});

如何键入模块 genName 的模拟函数 m

typescript 给我一个错误:

错误:(8、7) TS2540:无法分配给“genName”,因为它是常量或只读属性。

原文由 slideshowp2 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 229
1 个回答

这就是我如何解决同样的问题,以及我现在如何进行所有的嘲笑和间谍活动。

 import * as m from './module';

describe('your test', () => {
  let mockGenName;

  beforeEach(() => {
    mockGenName = jest.spyOn(m,
      'genName').mockImplemetation(() => 'franc');
  })

  afterEach(() => {
    mockGenName.mockRestore();
  })

  test('your test description', () => {
    // do something that calls the genName function
    expect(mockGenName).toHaveBeenCalledTimes(1);
  })

})

使用此设置,您可以以编程方式更改不同测试的 mock 的实现,然后断言调用了该函数以及调用它的内容,同时在测试之间和所有测试之后清除您的 mock。

原文由 Johan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题