如何用笑话创建 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);
}
您可以同时模拟 AtomManager
和 UserManager
,并在调用 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);
});
上面的代码片段做出了以下断言:
AtomManager.getStartAtom
被调用一次,它是用 mock botId
.
调用的
UserManager.getGlobalUser
被调用一次,它是用模拟会话对象调用的。
UserManager.getGlobalUser
已成功在传递的会话对象上添加 user
属性。
AtomProcessor.processAtom
被调用一次,它是用模拟会话和模拟启动原子调用的。
您可以类似地测试其他代码分支。
我是编写测试和开玩笑的初学者。我想测试调用此函数和 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);
}
您可以同时模拟 AtomManager
和 UserManager
,并在调用 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);
});
上面的代码片段做出了以下断言:
调用的AtomManager.getStartAtom
被调用一次,它是用 mockbotId
.UserManager.getGlobalUser
被调用一次,它是用模拟会话对象调用的。UserManager.getGlobalUser
已成功在传递的会话对象上添加user
属性。AtomProcessor.processAtom
被调用一次,它是用模拟会话和模拟启动原子调用的。
您可以类似地测试其他代码分支。