代码之家  ›  专栏  ›  技术社区  ›  RoyM

jest.spyOn似乎没有正确模拟默认导出的函数

  •  0
  • RoyM  · 技术社区  · 2 年前

    我似乎不明白为什么这次考试失败了;我已将问题简化为这两个文件。。

    [文件:esm-user.js]

    const getJack = () => {return 'Jack';};
    const getJill = () => {return 'Jill';};
    const getUsers = () => {return [getJack(), getJill()];};
    export default { getUsers, getJack };
    

    [文件:esm user spy.spec.js]

    import users from './esm-user';
    
    describe("Mocks and Spies", () => {
      test.only("partial mock (jack)", () => {
        var getJackSpy = jest.spyOn(users, 'getJack').mockReturnValue('Mock Jack');
        expect(users.getUsers()).toEqual(['Mock Jack', 'Jill']);
      });
    });
    

    输出

    expect(received).toEqual(expected) // deep equality
      Array [
    -   "Mock Jack",
    +   "Jack",
        "Jill",
      ]
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Adam Jenkins    2 年前

    getUsers 调用函数声明 getJack 但你在监视这处房产 getJack 的默认导出对象和 替换默认导出的该键处的值 使用您的模拟实现。

    getUsers 在那个文件中不调用 getJack 在默认导出对象上,它调用 getJack 文件中的声明。

    例如,以下是一种方法(还有很多其他方法),因为您正在嘲笑的函数的实现与中调用的函数相同 getUsers

    // esm-user.js
    const internalApi = {
      getJack: () => 'Jack',
      getJill: () => 'Jill',
    };
    
    const getUsers = () => {
      return [internalApi.getJack(), internalApi.getJill()];
    };
    
    export default { getUsers, internalApi };
    
    // esm-user-spy.spec.js
    import users from '../src/esm-user.js';
    
    describe('Mocks and Spies', () => {
      it.only('partial mock (jack)', () => {
        var getJackSpy = jest
          .spyOn(users.internalApi, 'getJack')
          .mockReturnValue('Mock Jack');
        expect(users.getUsers()).toEqual(['Mock Jack', 'Jill']);
      });
    });