这个让我难过。我使用mochajs作为NodeJS(Express 4)应用程序的测试套件。测试套件运行一系列mocha文件,所有这些都使用非常相似的设置,并且当单独运行时它们都运行正常 - 但是当作为套件运行时,一个文件突然失败并出现错误:
TypeError: request.defaults is not a function
at Object.module.exports.apiName (/my/system/file/path/repo/lib/reports.js:176:30)
所有文件都用于工作,即使作为套件运行,但我们最近从使用转换为使用config.json文件作为使用process.env.NODE_ENV
的环境决定因素 - 不确定它是否相关但是时机排队。
文件链的简化概述如下所示:
命令行电话:
env NODE_ENV=local mocha test
...运行file1,file2,file3等,直到:
测试/ reports.js
var env = process.env.NODE_ENV,
config = require('../config.json');
// Libraries
var app = require('../app'), // Imports the application
http = require('http'), // Sets up the test server on a different port
assert = require('assert'), // Checks values against expected
request = require('supertest'); // Tests API Calls - https://www.npmjs.com/package/supertest
describe.skip('Reports', function() {
before(function(){
// Start APP and expose on a test different port
this.server = http.createServer(app).listen(3000);
// Set request path to server - needs to match above
request = request('http://localhost:3000');
});
describe('#NameOfAPI', function(){
it('should return {status:"error"} if invalid report requested (Requires Mongo Running)', function(done) {
this.slow(300);
request
.get('/app/reports/api/nameOfAPI?report=invalidReportName')
.expect(200)
.expect('Content-Type', /json/)
.end(function(err, res){
it(res.body)
assert.equal(null, err); // Ensure no errors in request
assert.equal('error', res.body.status); // Ensure correct status returned for invalid data
assert.notEqual(-1, res.body.messages[1].search(/empty response/i)); // Ensure proper message returned for invalid report
done();
}); // End HTTP request for invalid report
}); // End Test for invalid report
});
请求(通过supertest)显然调用路由(app / reports / api) - > API(nameOfAPI)模块:
LIB / reports.js
var env = process.env.NODE_ENV,
config = require('../config.json'),
request = require('request');
var module.exports = {
requestReportToCsv: function(report_name, hostname, cb){
var req_limit = 100; // Set maximum concurrent requests - server returning numerous 'ECONNRESET' errors if hit too fast
// Set HTTP request defaults outside of any loops
// THIS IS THE LINE THAT'S FAILING - lib/reports.js:176:30
var http_request = request.defaults({ json: true, pool: { maxSockets: req_limit } });
if (env != 'prod') {
http_request = http_request.defaults({headers: {'dev-cookie': 'on', 'Cookie':'dev_cookie=on'}});
}
http_request.post('https://website.com/api/info.php', {form: post_data}, function(err, resp, body){
// Uncomment to see an example of the report response
...SO ON AND SO FORTH
我的生活中能否找出为什么request.defaults({})
在使用env NODE_ENV=local mocha test/reports
单独调用mocha测试文件时可以正常工作但在使用{{作为套件的一部分运行时失败} 1}}。有什么想法吗?
修改:注意,重命名env NODE_ENV=local mocha test
变量var request = require('supertest')
(以及所有后续引用)并没有效果,所以我不认为它是范围/变量/名称问题。