在 jestjs 中模拟嵌套函数

Ada*_*m S 4 javascript unit-testing method-chaining jestjs

我有一个非常复杂的对象,我用它来模拟 DataTable() 对象以进行测试。

const obj = {
  DataTable: () => {
    return {
      columns: () => {
        return {
          data: () => {
            return {
              eq: () => {
                return {
                  indexOf: jest.fn(),
                };
              },
            };
          },
          visible: () => {
            return jest.fn();
          },
        };
      },
    };
  },
};
Run Code Online (Sandbox Code Playgroud)

在我的测试代码中,我试图监视其中一些函数,但它总是返回未定义。有没有办法模拟深层嵌套函数的返回值?

    jest.spyOn(obj.DataTable().columns().data().eq(), 'indexOf').mockReturnValue('test');
    console.log(obj.DataTable().columns().data().eq().indexOf()); // returns undefined, should return 'test'
Run Code Online (Sandbox Code Playgroud)

sli*_*wp2 10

这是单元测试解决方案:

\n\n

index.ts:

\n\n
import { obj } from \'./obj\';\n\nexport function main() {\n  return obj.DataTable().columns().data().eq().indexOf();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

obj.ts:

\n\n
export const obj = {\n  DataTable: () => {\n    return {\n      columns: () => {\n        return {\n          data: () => {\n            return {\n              eq: () => {\n                return {\n                  indexOf: () => \'real data\',\n                };\n              },\n            };\n          },\n        };\n      },\n    };\n  },\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

index.test.ts:

\n\n
import { main } from \'./\';\nimport { obj } from \'./obj\';\n\ndescribe(\'61396089\', () => {\n  afterEach(() => {\n    jest.restoreAllMocks();\n  });\n  it(\'should pass\', () => {\n    const mockDataTable = {\n      columns: jest.fn().mockReturnThis(),\n      data: jest.fn().mockReturnThis(),\n      eq: jest.fn().mockReturnThis(),\n      indexOf: jest.fn().mockReturnValueOnce(\'fake data\'),\n    };\n    jest.spyOn(obj, \'DataTable\').mockImplementationOnce(() => mockDataTable);\n    const actual = main();\n    expect(actual).toBe(\'fake data\');\n    expect(mockDataTable.columns).toBeCalledTimes(1);\n    expect(mockDataTable.data).toBeCalledTimes(1);\n    expect(mockDataTable.eq).toBeCalledTimes(1);\n    expect(mockDataTable.indexOf).toBeCalledTimes(1);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

带有覆盖率报告的单元测试结果:

\n\n
 PASS  stackoverflow/61396089/index.test.ts (20.978s)\n  61396089\n    \xe2\x9c\x93 should pass (8ms)\n\n----------|---------|----------|---------|---------|-------------------\nFile      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n----------|---------|----------|---------|---------|-------------------\nAll files |   44.44 |      100 |   16.67 |   44.44 |                   \n index.ts |     100 |      100 |     100 |     100 |                   \n obj.ts   |   16.67 |      100 |       0 |   16.67 | 3-10              \n----------|---------|----------|---------|---------|-------------------\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        23.889s\n
Run Code Online (Sandbox Code Playgroud)\n\n

源代码:https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/61396089

\n