嵌套循环中超级测试响应后修改对象的问题

时间:2018-12-31 09:41:34

标签: javascript node.js for-loop supertest

我的代码如下:

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循环内打印时给出正确填充的输出。尽管我的代码是同步的并且没有使用Promise,但我不知道为什么会这样。

编辑:经过一些实验(例如,在代码中注释了supertest代码,并简单地修改了for循环中的results对象),我得到了预期的输出for results在for循环之外。因此,我相信supertest的使用方式存在问题。我打算以同步方式使用它。

2 个答案:

答案 0 :(得分:2)

由于Node.js支持异步,因此,如果将日志放在for循环之外,则将首先打印日志,因为与for循环的执行时间相比,执行时间更短。

您可以在这里尝试这种组合:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

例如:

CoreModule

输出:

  

“你好”

     

“ d”

     

“ e”

     

“ f”

答案 1 :(得分:0)

我没有发现任何明显的同步使用supertest的方法,因此我通过使用sync-request为自己解决了这个问题。