如何用笑话创建 class 的实例

how to create instance of class with jest

我是编写测试和开玩笑的初学者。我想测试调用此函数和 return 成功承诺。我使用 jest 为函数编写单元测试。该函数类似于我无法创建的 class 的参数实例,因为它的构造函数需要我无法访问的参数。我有很多具有 Session 之类参数的函数。当您无法为其提供参数时,如何测试功能?我可以模拟 class 的实例或函数并在没有参数的情况下处理它吗?

async initFlow(session: Session) {
    const nextAtomId = session.userInput.getParam('NEXT_ATOM');
    if (nextAtomId) {
        const nextAtom = await AtomManager.findActiveAtom(nextAtomId);
        if (!session.features.useTerms || ['beforeTerms', 'TermsAndConditions'].includes(nextAtom.type)) {
            return AtomProcessor.processAtom(session, nextAtom);
        }
    }

    const start = await AtomManager.getStartAtom(`${session.botId}`);
    if (!start) {
        throw new Error('Could not find start atom');
    }

    session.user = await UserManager.getGlobalUser(session); // getGlobalUser makes initUser under the hood.
    return AtomProcessor.processAtom(session, start);
}

您可以同时模拟 AtomManagerUserManager,并在调用 initFlow 时提供模拟会话对象。

jest.mock("./path/to/AtomManager");
jest.mock("./path/to/UserManager");

it("works", async () => {
  const mockSession = {
    userInput: {
      getParam: jest.fn(),
    },
    botId: "123",
  };
  const mockUser = "user123";
  const mockStartAtom = "atom123";
  AtomManager.getStartAtom.mockResolveValue(mockStartAtom);
  UserManager.getGlobalUser.mockResolveValue(mockUser);

  await initFlow(mockSession);

  expect(mockSession.user).toBe(mockUser);
  expect(AtomManager.getStartAtom).toHaveBeenCalledTimes(1);
  expect(AtomManager.getStartAtom).toHaveBeenCalledWith(mockSession.botId);
  expect(UserManager.getGlobalUser).toHaveBeenCalledTimes(1);
  expect(UserManager.getGlobalUser).toHaveBeenCalledWith(mockSession);
  expect(AtomProcessor.processAtom).toHaveBeenCalledTimes(1);
  expect(AtomProcessor.processAtom).toHaveBeenCalledWith(mockSession, mockStartAtom);
});

上面的代码片段做出了以下断言:

  1. AtomManager.getStartAtom 被调用一次,它是用 mock botId.

    调用的
  2. UserManager.getGlobalUser被调用一次,它是用模拟会话对象调用的。

  3. UserManager.getGlobalUser 已成功在传递的会话对象上添加 user 属性。

  4. AtomProcessor.processAtom 被调用一次,它是用模拟会话和模拟启动原子调用的。

您可以类似地测试其他代码分支。