问题模拟节点模块
Issues mocking node modules
我正在使用 superagent 来支持 React 应用程序中的一些 XHR 服务。我已经围绕 superagent 编写了一个非常薄的包装器以使配置更容易。事实证明,尝试测试这一薄层非常令人头疼。
我知道 issues 有 jest 和 node 核心依赖项,我可以通过 dontMock
ing superagent 的依赖项让事情正常进行。但我更喜欢开玩笑只是嘲笑 superagent
而不是默认情况下爆炸。
结果是我的 package.json 中的一个极其冗长的测试介绍或 unMockedModulePatterns
条目,有没有更好的方法?
// my-module.js
'use strict';
var request = require('superagent');
module.exports = function () {
return request.get('http://whosebug.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://whosebug.com/questions/tagged/jestjs');
});
});
我认为更好的方法是写 manual mocks,像这样:
__tests__/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://whosebug.com/questions/tagged/jestjs');
});
});
__mocks__/superagent.js:
module.exports = {
get: jest.genMockFunction()
};
codeundertest.js:
var request = require('superagent');
module.exports = function () {
return request.get('http://whosebug.com/questions/tagged/jestjs');
};
jest 的自动模拟在工作时非常好,但在许多情况下,编写自己的模拟比尝试支持其自动模拟更容易。
我正在使用 superagent 来支持 React 应用程序中的一些 XHR 服务。我已经围绕 superagent 编写了一个非常薄的包装器以使配置更容易。事实证明,尝试测试这一薄层非常令人头疼。
我知道 issues 有 jest 和 node 核心依赖项,我可以通过 dontMock
ing superagent 的依赖项让事情正常进行。但我更喜欢开玩笑只是嘲笑 superagent
而不是默认情况下爆炸。
结果是我的 package.json 中的一个极其冗长的测试介绍或 unMockedModulePatterns
条目,有没有更好的方法?
// my-module.js
'use strict';
var request = require('superagent');
module.exports = function () {
return request.get('http://whosebug.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://whosebug.com/questions/tagged/jestjs');
});
});
我认为更好的方法是写 manual mocks,像这样:
__tests__/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://whosebug.com/questions/tagged/jestjs');
});
});
__mocks__/superagent.js:
module.exports = {
get: jest.genMockFunction()
};
codeundertest.js:
var request = require('superagent');
module.exports = function () {
return request.get('http://whosebug.com/questions/tagged/jestjs');
};
jest 的自动模拟在工作时非常好,但在许多情况下,编写自己的模拟比尝试支持其自动模拟更容易。