【发布时间】:2018-11-09 06:16:45
【问题描述】:
我有一个名为 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 中模拟这个方法的正确方法是什么?
【问题讨论】:
-
我相信你必须打电话给
jest.mock,给它与导入时相同的参数。因此,如果使用import {createMap} from './services/map-creation.service';然后将其模拟为jest.mock('./services/map-creation.service');,这会迫使您将测试与模块放在同一目录中(这是常见的做法)。 -
另一种选择是将 TS 配置为使用非相对模块导入 link (背后的想法是 jest 实际上并不了解您用于导入和模拟的这两个路径是相同的)
-
除了DI还有什么办法吗?
-
ts-mock-imports 是我创建的一个库,允许您使用 typescript 模拟类导入。
标签: typescript unit-testing mocking jestjs