模拟节点模块的问题

时间:2015-01-31 23:28:41

标签: node.js jestjs

我使用superagent支持反应应用程序中的某些XHR服务。我已经在superagent上写了一个非常薄的包装器,以便更容易配置。试图测试这个薄层已经证明是非常令人头痛的问题。

我意识到issues有jest和节点核心依赖,我可以通过dontMock superagent的依赖关系来完成工作。但我更喜欢让jest只是模拟superagent而不会在默认情况下爆炸。

结果是我的package.json中的一个非常详细的测试介绍或unMockedModulePatterns条目,有更好的方法吗?

// my-module.js
'use strict';

var request = require('superagent');

module.exports = function () {
  return request.get('http://stackoverflow.com/questions/tagged/jestjs');
};

示例测试:

// __tests__/my-module-test.js
'use strict';

jest.dontMock('../');
// T_T
jest.dontMock('superagent');
jest.dontMock('debug');
jest.dontMock('tty');
jest.dontMock('util');
jest.dontMock('stream');
jest.dontMock('fs');
jest.dontMock('delayed-stream');
jest.dontMock('mime');
jest.dontMock('path');

describe('mymodule', function () {
  var myModule, request;

  beforeEach(function () {
    myModule = require('../');
    request = require('superagent');

    request.get = jest.genMockFunction(function () {
      return {
        get: jest.genMockFunction()
      }
    })
  });

  it('makes an xhr request using superagent', function() {
    var req = myModule();
    expect(request.get).toBeCalledWith('http://stackoverflow.com/questions/tagged/jestjs');
  });
});

1 个答案:

答案 0 :(得分:6)

我认为更好的方法是写manual mocks,如下所示:

__测试__ / codeundertest.js:

jest.dontMock('../codeundertest');
describe('whatever', function() {
  it('should do the do', function() {
    var request = require('superagent');

    require('../codeundertest')();
    expect(request.get.mock.calls[0][0]).toBe('http://stackoverflow.com/questions/tagged/jestjs');
  });
});

__嘲笑__ / superagent.js:

module.exports = {
  get: jest.genMockFunction()
};

codeundertest.js:

var request = require('superagent');
module.exports = function () {
  return request.get('http://stackoverflow.com/questions/tagged/jestjs');
};

jest的自动模拟在它工作时非常好但是在很多情况下编写自己的模拟比尝试支持自动模式更容易。