另一个模块的对象内部的模拟功能(节点+开玩笑)

时间:2019-01-14 15:28:30

标签: node.js ecmascript-6 jestjs

我的项目中有两个文件:

controller.js

const controller = (request, response, route_name) => {
    parser[route_name](request.query, request.body, (err, data) => {
        ...
    }
};

export default controller;

parser.js

const parser = {
    foo: (query, body, callback) => {
        ...
        return callback(obj, null);
    }
};

export default parser;

现在,我目前正在尝试测试控制器。第一个测试是发送格式错误的请求,解析器除外,它使用某些参数调用回调。我没有找到方法或库来更改解析器对象内部函数的行为。你们可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

假设您将解析器模块这样导入controller.js

import parser from './parser`

您可以在测试文件中轻松模拟这样的模块:

jest.mock('./parser', () => ({ // note the path is relative to your test file
  foo: () => //your mock implementation here
}))

如果您想测试是否使用正确的参数调用了parser.foo,则可以使其成为间谍并将解析器导入测试以检查正确的调用:

jest.mock('./parser', () => ({
  foo: jest.fn(() => //your mock implementation here)
}))
import parser from './parser'
import controller from './controller

controller(someRequestMock, someResponseMock, 'foo' )
expect(parser.foo).toHaveBeenCalledWith(...)