我有一个名为
map-creation.service.ts
的模块:
export const createMap = (asyncJobId: string, resourceUrl: string, s3DestFolder: string) => {
};
在我的端点中使用:
import {createMap} from './services/map-creation.service';
const router = express.Router();
const routePrefix = config.get('server.routePrefix');
router.post(`/${routePrefix}`, validate(validation), (req: express.Request, res: express.Response) => {
createMap(req.body.asyncJobId, req.body.resourceUrl, req.body.s3DestFolder);
res.status(201).json({message: 'Created'});
});
当我尝试在测试中模拟此模块,并想测试在请求端点时是否调用它时,我仍然得到:
Expected mock function to have been called with: ... But it was not called.
jest.mock('../../../src/services/map-creation.service');
import {createMap} from '../../../src/services/map-creation.service';
这是我的测试:
it('should call the map-creation service', () => {
return request(server)
.post(`/${routePrefix}`)
.send({
asyncJobId,
resourceUrl,
s3DestFolder
})
.then(res => {
expect(createMap).toBeCalledWith(asyncJobId, resourceUrl, s3DestFolder);
});
});
如果我嘲笑这样的方法:
import {createMap} from '../../../src/services/map-creation.service';
createMap = jest.fn();
测试通过了,但 tslint 抱怨:
Cannot assign to 'createMap' because it is not a variable
。那么在 TypeScript 和 Jest 中模拟此方法的正确方法是什么?
那么在 TypeScript 和 Jest 中模拟此方法的正确方法是什么?
根据需要使用依赖注入来注入模拟版本和真实版本的函数。
推荐的 DI 框架:http://inversify.io/
但 tslint 抱怨:无法分配给“createMap”,因为它不是变量
请不要这样做。导入应该被认为是不可变的。您也会因此收到编译时 TypeScript 错误,当模块支持变为本机时,您将收到运行时错误。
依赖注入的问题在于,它需要您重构所有现有的解决方案,以便您的代码在测试下能够正常运行。它还忽略了 ES6 已经有一个可以被劫持的导入/导出系统的事实。
ts-mock-imports是一个库(我创建的),旨在处理模拟导入而无需依赖注入。
在您的测试文件中:
import * as createMapModule from '../../../src/services/map-creation.service';
import { ImportMock } from 'ts-mock-imports';
const mockHandler = ImportMock.mockOther(createMapModule, 'createMap', jest.fn());
<-- Test Code Here --->
// Ensure you restore the mock once the tests are complete
mockHandler.restore()