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

sli*_*wp2 6 javascript typescript jestjs

我使用ts-jestjest用Typescript编写测试文件。

我很困惑如何键入模块的模拟功能。

这是我的代码:

./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;
Run Code Online (Sandbox Code Playgroud)

./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(); 

  });

});
Run Code Online (Sandbox Code Playgroud)

如何输入genName模块的模拟功能m

typescript 给我一个错误在这里:

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

小智 11

这就是我如何解决同样的问题以及我现在如何进行所有嘲笑和监视。

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);
  })

})

Run Code Online (Sandbox Code Playgroud)

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


phi*_*ick 3

您想要模拟该模块,然后更改其中的导出函数。这应该取代您的导入声明。

jest.mock('./module', () => ({
    genName: jest.fn().mockImplementation(() => 'emilie')
}))
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,因为 genName 的范围仅限于该块本地,并且在整个文件中不可用 (5认同)