在 nodejs express 应用程序中记录所有远程调用以进行测试
Record all remote calls in a nodejs express app for testing
目标是重新记录 api 测试。这个测试是一种集成测试,他们加载整个应用程序及其所有中间件并拦截外部 http 调用并记录它们。
在 Python 世界存在 "WebTest" 和 "VCRPY"。
应用程序:
'use strict';
const express = require('express');
const request = require('superagent');
var app = express();
app.get('/hammer/version', function(req, res) {
request
.get('http://httpbin.org/get')
.end(function(err, response) {
console.log(response.body);
res.status(200).json({
version: '0.1.0',
url: response.body.url
});
});
});
module.exports = app;
测试:
/* global describe, it */
'use strict';
const request = require('supertest');
const app = require('./app.js');
var path = require('path');
var tape = require('tape');
var tapeNock = require('tape-nock');
// call tapeNock with tape and an options object
var test = tapeNock(tape, {
fixtures: path.join(__dirname, 'fixtures')
});
describe('Version test', function() {
this.timeout(0);
it('test version', function(done) {
test('record_version.json', function(t) {
request(app)
.get('/hammer/version')
.expect(200, {
url: "http://httpbin.org/get",
version: '0.1.0'
})
.end(function(err, res) {
if (err) return done(err);
t.end();
done();
});
});
});
});
"package.json":
{
"name": "remote_node_test",
"version": "1.0.0",
"description": "",
"main": "app.js",
"dependencies": {
"express": "^4.14.0",
"mocha": "^3.2.0",
"nock": "^9.0.2",
"superagent": "^3.3.1",
"supertest": "^2.0.1",
"tape": "^4.6.3",
"tape-nock": "^1.4.0"
},
"devDependencies": {
"mocha": "^3.2.0"
},
"scripts": {
"test": "mocha"
},
"author": "",
"license": "ISC"
}
测试是 运行 和 "mocha":
NOCK_BACK_MODE=record node_modules/mocha/bin/mocha
第一个 运行 有效,第二个 运行 和 "lockdown/record" 无效。
错误:
% NOCK_BACK_MODE=lockdown node_modules/mocha/bin/mocha test.js :(
Version test
TAP version 13
# details.json
1) return current version
0 passing (32ms)
1 failing
1) Version test return current version:
TypeError: Cannot read property 'status' of undefined
at Test._assertStatus (node_modules/supertest/lib/test.js:263:10)
at Test._assertFunction (node_modules/supertest/lib/test.js:281:11)
at Test.assert (node_modules/supertest/lib/test.js:171:18)
at Server.assert (node_modules/supertest/lib/test.js:131:12)
at emitCloseNT (net.js:1553:8)
at _combinedTickCallback (internal/process/next_tick.js:71:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
记录的都是请求,但我只需要记录"external"个请求,防止"mocking/recording"我的内在逻辑。
一个解决方案似乎是“replay”并配置 "passThrough" 对我的本地应用程序的请求。
/* global describe, it */
'use strict';
const request = require('supertest');
const app = require('./app.js');
var path = require('path');
const Replay = require('replay');
Replay.fixtures = __dirname + '/fixtures/replay';
Replay.passThrough('localhost', '127.0.0.1', '0.0.0.0');
describe('Version test', function() {
this.timeout(0);
it('test version', function(done) {
request(app)
.get('/hammer/version')
.expect(200, {
url: "http://httpbin.org/get",
version: '0.1.0'
})
.end(function(err, res) {
if (err) return done(err);
done();
});
});
});
如果您使用的是 mocha,您可能需要寻找类似的 nock/nockBack 特定于 mocha 的助手 (https://www.npmjs.com/search?q=mocha+nock)
话虽这么说,您也可能 运行 遇到问题,其中 supertest 对应用程序进行的 HTTP 调用被 nockBack 获取。
我做了一个小例子,它只使用磁带来完成你想要完成的事情:
https://github.com/Flet/tape-nock-with-supertest-example
setup-tape-nock.js 中定义的 afterRecord 和 before 函数可能是您需要的秘诀,即使使用其他一些 nockBack mocha 助手也是如此。
希望对您有所帮助!
目标是重新记录 api 测试。这个测试是一种集成测试,他们加载整个应用程序及其所有中间件并拦截外部 http 调用并记录它们。
在 Python 世界存在 "WebTest" 和 "VCRPY"。
应用程序:
'use strict';
const express = require('express');
const request = require('superagent');
var app = express();
app.get('/hammer/version', function(req, res) {
request
.get('http://httpbin.org/get')
.end(function(err, response) {
console.log(response.body);
res.status(200).json({
version: '0.1.0',
url: response.body.url
});
});
});
module.exports = app;
测试:
/* global describe, it */
'use strict';
const request = require('supertest');
const app = require('./app.js');
var path = require('path');
var tape = require('tape');
var tapeNock = require('tape-nock');
// call tapeNock with tape and an options object
var test = tapeNock(tape, {
fixtures: path.join(__dirname, 'fixtures')
});
describe('Version test', function() {
this.timeout(0);
it('test version', function(done) {
test('record_version.json', function(t) {
request(app)
.get('/hammer/version')
.expect(200, {
url: "http://httpbin.org/get",
version: '0.1.0'
})
.end(function(err, res) {
if (err) return done(err);
t.end();
done();
});
});
});
});
"package.json":
{
"name": "remote_node_test",
"version": "1.0.0",
"description": "",
"main": "app.js",
"dependencies": {
"express": "^4.14.0",
"mocha": "^3.2.0",
"nock": "^9.0.2",
"superagent": "^3.3.1",
"supertest": "^2.0.1",
"tape": "^4.6.3",
"tape-nock": "^1.4.0"
},
"devDependencies": {
"mocha": "^3.2.0"
},
"scripts": {
"test": "mocha"
},
"author": "",
"license": "ISC"
}
测试是 运行 和 "mocha":
NOCK_BACK_MODE=record node_modules/mocha/bin/mocha
第一个 运行 有效,第二个 运行 和 "lockdown/record" 无效。
错误:
% NOCK_BACK_MODE=lockdown node_modules/mocha/bin/mocha test.js :(
Version test
TAP version 13
# details.json
1) return current version
0 passing (32ms)
1 failing
1) Version test return current version:
TypeError: Cannot read property 'status' of undefined
at Test._assertStatus (node_modules/supertest/lib/test.js:263:10)
at Test._assertFunction (node_modules/supertest/lib/test.js:281:11)
at Test.assert (node_modules/supertest/lib/test.js:171:18)
at Server.assert (node_modules/supertest/lib/test.js:131:12)
at emitCloseNT (net.js:1553:8)
at _combinedTickCallback (internal/process/next_tick.js:71:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
记录的都是请求,但我只需要记录"external"个请求,防止"mocking/recording"我的内在逻辑。
一个解决方案似乎是“replay”并配置 "passThrough" 对我的本地应用程序的请求。
/* global describe, it */
'use strict';
const request = require('supertest');
const app = require('./app.js');
var path = require('path');
const Replay = require('replay');
Replay.fixtures = __dirname + '/fixtures/replay';
Replay.passThrough('localhost', '127.0.0.1', '0.0.0.0');
describe('Version test', function() {
this.timeout(0);
it('test version', function(done) {
request(app)
.get('/hammer/version')
.expect(200, {
url: "http://httpbin.org/get",
version: '0.1.0'
})
.end(function(err, res) {
if (err) return done(err);
done();
});
});
});
如果您使用的是 mocha,您可能需要寻找类似的 nock/nockBack 特定于 mocha 的助手 (https://www.npmjs.com/search?q=mocha+nock)
话虽这么说,您也可能 运行 遇到问题,其中 supertest 对应用程序进行的 HTTP 调用被 nockBack 获取。
我做了一个小例子,它只使用磁带来完成你想要完成的事情: https://github.com/Flet/tape-nock-with-supertest-example
setup-tape-nock.js 中定义的 afterRecord 和 before 函数可能是您需要的秘诀,即使使用其他一些 nockBack mocha 助手也是如此。
希望对您有所帮助!