无法让Jest模拟工作

时间:2016-10-30 01:57:06

标签: javascript unit-testing mocking jestjs

我在让Jest嘲笑工作时遇到了一些麻烦。

我正在尝试对由request驱动的具有一些异步位的模块进行单元测试。

我目前的理解是:

  • 我可以使用jest.mock()方法来模拟整个模块。
  • 我可以模拟方法request.getrequest.post等,使它们同步并通过在__mocks__/目录中创建文件来传递特定的响应。
  • Jest将在__mocks__/需要/导入时自动锁定模块。
  • 我可以在导入将其导入测试文件的模块后通过加载来覆盖request依赖关系。

我想我错过了一些明显的东西。

模块我想测试:

// module.js
import request from 'request'

export default function foo() {
  let options = { /* ... */ }
  let callback = function (error, response, body) {
    if (!error && response.statusCode === 200) {
      return /* Response A */
    } else {
      return /* Response B */
    }
  }

  request.post(options, callback);
}

模拟请求模块:

// __mock__/request.js

function post(options, callback) {
  callback(undefined, {statusCode: 200})
}

const request = jest.genMockFromModule('request')
request.post = post

export default request;

模块测试:

// module.spec.js
import foo from './module'
jest.mock('request')

test('should return response A', function () {
  expect(foo()).toBe(/* Response A */)
});

当我运行模块测试时,

  • request模块似乎没有被模拟,
  • foo不会生成“响应A”或“响应B”

任何人都知道如何嘲笑它以正确测试它?

1 个答案:

答案 0 :(得分:-1)

jest.mock('request')之前移动import ...对我有帮助。