我希望测试我的下一个API路由,它使用micro框架(类似于在使用next-connect时表示)。
我有个服务:
export class UserService {
constructor(...) {}
async findUser({ email }: Pick<IUserModel, 'email'>) {
...
}
}我的API端点:
import { NextApiRequest, NextApiResponse } from 'next';
import nc from 'next-connect';
import { UserService } from './UserService'; // Mock and prevent execution
const userService = new UserService();
export default nc().post(async (req: NextApiRequest, res: NextApiResponse) => {
try {
userService.findUser({ email: 'john.doe@example.com' });
return res.status(200).send({ done: true });
} catch (error: any) {
return res.status(500).end(error.message);
}
});我希望完全模拟导入,并防止任何依赖代码的执行。
import { UserService } from './UserService';例如,如果在console.log构造函数中有一个UserService (),则不应该运行它,因为导入是一个完全模拟的导入。
更新:
我尝试过使用jest.mock,但他们似乎并没有真正地嘲笑我的进口品。我在UserService构造函数中添加了一个UserService,它在使用jest.mock时继续被触发。
import signup from './signup';
jest.mock('./UserService');
describe('signup', () => {
it('should complete the happy path', async () => {
const req: IncomingMessage = {} as unknown as IncomingMessage;
const res: ServerResponse = {
end: jest.fn(),
} as unknown as ServerResponse;
const actual = await signup(req, res);
expect(actual).toBe(...);
});
});发布于 2022-02-04 19:48:58
如果您的意思是在jest测试中模拟,那么如果您想要模拟一个方法,可以只使用jest.mock('./userService');或jest.spyOn(UserService, 'findUser')。
如果您想要一个特定用例的模拟,您将创建一个模拟服务,并根据某些标志有条件地导入。
例如:
// UserService.js
export class UserService {
constructor(...) {}
async findUser({ email }: Pick<IUserModel, 'email'>) {
// calls real API
}
}
// UserService.mock.js
export class MockUserService {
constructor(...) {}
async findUser({ email }: Pick<IUserModel, 'email'>) {
// calls fake API or just returns a promise or anything you want
}
}
// Your Endpoint
import { NextApiRequest, NextApiResponse } from 'next';
import nc from 'next-connect';
import { UserService } from './UserService';
import { MockUserService } from './UserService.mock'; // Mock
let userService;
if (someCondition) {
userService = new UserService();
} else {
userService = new MockUserService();
}
...
// The idea is you want to dynamically change what you're importing
const Something = process.env.NODE_ENV === 'development' ?
require('./FakeSomething') : require('./RealSomething');https://stackoverflow.com/questions/70991915
复制相似问题