在嵌套 for 循环内的超级测试响应后修改对象的问题
Issue with object modified after supertest response inside nested for loops
我的代码如下所示:
let fs = require('fs');
let path = require('path');
let supertest = require('supertest');
let json = require('../../Util/json');
let chai = require('chai');
let assert = chai.assert;
let client = supertest("some_base_url");
describe('My test suite', function () {
it('My sample test', () => {
let results = {};
fs.readdirSync("some_dir").forEach(dir => {
fs.readdirSync("some_dir" + dir).forEach(file => {
console.log(`Found file ${file} in directory ${dir}`);
let json_file = "some_dir" + dir + path.sep + file;
let data = fs.readFileSync(json_file, 'utf8');
if (dir !== undefined) {
let url = dir + file.split('.')[0];
console.log("Request endpoint:", url);
client.get(url)
.set('Content-Type', 'application/json')
.expect(200)
.end(function (error, response) {
if (error) {
console.log("Error:", error);
} else {
data_obj = JSON.parse(data);
result_obj = JSON.parse(response.text);
results[dir + '-' + file] = json.assertJson(data_obj, result_obj); // assertJson results boolean value
}
});
} else {
console.log(`Could not find any endpoint defined for ${dir}, skipping tests for the same.`);
}
});
});
console.log("Results:",JSON.stringify(results, null, 2));
assert(!Object.values(results).includes(false));
});
});
问题是 results
对象在外部 for 循环外打印时为空,但在 for 循环内打印时提供正确填充的输出。尽管我的代码是同步的并且没有使用承诺,但我想知道为什么会这样。
编辑: 在做了一些实验之后(比如在我的代码中注释掉 supertest
代码并简单地修改 for 循环内的 results
对象) ,我在 for 循环之外得到了 results
的预期输出。所以我认为我使用 supertest
的方式有问题。我打算以同步方式使用它。
由于 Node.js 支持异步,如果您将日志放在 for 循环之外,那么将首先打印日志,因为与 for 循环的执行时间相比,它的执行时间会更少。
您可以在这里尝试这样的组合:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
例如:
var array1 = ['a'];
var array2 = ['d', 'e', 'f'];
array1.forEach(function(element1) {
array2.forEach(function(element2) {
setTimeout(function(){
console.log(element2);
}, 1000)
});
});
console.log("Hello");
输出:
"Hello"
"d"
"e"
"f"
我没有找到任何以同步方式使用 supertest
的明显方法,所以我通过使用 sync-request.
自己解决了这个问题
我的代码如下所示:
let fs = require('fs');
let path = require('path');
let supertest = require('supertest');
let json = require('../../Util/json');
let chai = require('chai');
let assert = chai.assert;
let client = supertest("some_base_url");
describe('My test suite', function () {
it('My sample test', () => {
let results = {};
fs.readdirSync("some_dir").forEach(dir => {
fs.readdirSync("some_dir" + dir).forEach(file => {
console.log(`Found file ${file} in directory ${dir}`);
let json_file = "some_dir" + dir + path.sep + file;
let data = fs.readFileSync(json_file, 'utf8');
if (dir !== undefined) {
let url = dir + file.split('.')[0];
console.log("Request endpoint:", url);
client.get(url)
.set('Content-Type', 'application/json')
.expect(200)
.end(function (error, response) {
if (error) {
console.log("Error:", error);
} else {
data_obj = JSON.parse(data);
result_obj = JSON.parse(response.text);
results[dir + '-' + file] = json.assertJson(data_obj, result_obj); // assertJson results boolean value
}
});
} else {
console.log(`Could not find any endpoint defined for ${dir}, skipping tests for the same.`);
}
});
});
console.log("Results:",JSON.stringify(results, null, 2));
assert(!Object.values(results).includes(false));
});
});
问题是 results
对象在外部 for 循环外打印时为空,但在 for 循环内打印时提供正确填充的输出。尽管我的代码是同步的并且没有使用承诺,但我想知道为什么会这样。
编辑: 在做了一些实验之后(比如在我的代码中注释掉 supertest
代码并简单地修改 for 循环内的 results
对象) ,我在 for 循环之外得到了 results
的预期输出。所以我认为我使用 supertest
的方式有问题。我打算以同步方式使用它。
由于 Node.js 支持异步,如果您将日志放在 for 循环之外,那么将首先打印日志,因为与 for 循环的执行时间相比,它的执行时间会更少。
您可以在这里尝试这样的组合:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
例如:
var array1 = ['a'];
var array2 = ['d', 'e', 'f'];
array1.forEach(function(element1) {
array2.forEach(function(element2) {
setTimeout(function(){
console.log(element2);
}, 1000)
});
});
console.log("Hello");
输出:
"Hello"
"d"
"e"
"f"
我没有找到任何以同步方式使用 supertest
的明显方法,所以我通过使用 sync-request.