Проблема, связанная с изменением объекта после супер-теста ответа внутри вложенного цикла for - PullRequest
0 голосов
/ 31 декабря 2018

Мой код выглядит следующим образом:

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код в моем коде и просто изменив объект results внутри цикла for), я получаю ожидаемый вывод для results вне циклов for.Так что я считаю, что что-то не так с тем, как я использую supertest.Я намерен использовать его синхронно.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Я не нашел никаких очевидных способов использовать supertest синхронно, поэтому решил для себя проблему с помощью sync-request .

0 голосов
/ 31 декабря 2018

Поскольку Node.js поддерживает асинхронный режим, если вы поместите журнал вне цикла, журнал будет напечатан первым, поскольку для его выполнения потребуется меньше времени по сравнению со временем выполнения цикла 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"

"е"

"е"

...