Как прочитать файл перед запуском набора тестов mocha

#javascript #node.js #mocha.js

#javascript #node.js #mocha.js

Вопрос:

Я пытаюсь прочитать файл, который содержит все входные данные для набора тестов mocha. При попытке прочитать этот файл я просто получаю, что входные данные (карта) равны нулю.

Scrapper_cheerio.js написан в формате async / await однако не верьте, что это имеет какое-либо отношение к тому, что файл не читается.

если я правильно понимаю before, материал в блоке before должен произойти до того, как произойдет какой-либо тест. В настоящее время это то, что я пробовал :

 const assert = require('chai').assert;
const fs = require('fs');

const scrapper_cheerio = require('../scrapper/Scrapper_cheerio');
describe('test1', function(){
    var inputs = null;
    before( function(done){
        fs.readFile('./inputs.txt', 'utf8', 
            function(err, fileContents){
                if(err) throw err;
                const string_data = fileContents;
                const data = eval(string_data);
                inputs = new Map(data);
                done();
            });
    });

    describe('is_null_input()', function(){
        const is_null_input = inputs.get('is_null_input');
        const json_result = scrapper_cheerio.is_null_json(is_null_input);
        it('should return a json string', function(){
            assert.isObject(json_result, 'is json object');
       }); 
    });
  

});

Я просто ожидаю, что этот первый тест будет верным, потому что его проще всего протестировать, однако я не могу прочитать файл. Я новичок в тестировании mocha, поэтому у меня могут быть и, вероятно, действительно есть некоторые вопиющие и очевидные ошибки. Любая помощь приветствуется.

Редактировать 1 :

итак, перед быстрым удалением было указано (почему это было действительно полезно, спасибо.), что мне нужно выполнить асинхронный вызов, и я сделал. Теперь я могу прочитать файл и вижу, что я его читаю, однако я не могу передать значение в конец

     describe('test1', function(done){
        var inputs = null;

        before('test1', function() {
            const string_data = fs.readFileSync('./inputs.txt', 'utf8');
            const data = eval(string_data);
            console.log('data uptop')
            inputs = new Map(data);
            console.log(inputs);
            done();
        });

        describe('is_null_input()', function(done){
            const is_null_input = inputs.get('is_null_input');
            var json_result = scrapper_cheerio.is_null_json(is_null_input);
            console.log('these are json results', json_result);
            it('should return a json string', function(){
                assert.isObject(json_result, 'is json object');
        }); 
        });

    });
  

Таким образом, я могу прочитать файл, однако он недоступен в описании.

Комментарии:

1. Что именно вызвало is_null_input() сбой? Вы получали какие-либо сообщения об ошибках?

2. ‘Не удается прочитать свойство ‘get’ из null’ , в этом файле хранится строка в виде двумерного массива. однако я считаю, что файл не читается.

Ответ №1:

Вот упрощенный рабочий тест, который должен вас ускорить:

inputs.txt

 [[ 'is_null_input', true ]]
  

code.test.js

 const fs = require('fs');
const expect = require('chai').expect;

describe('test1', function () {
  var inputs = null;

  before('test1', function (done) {
    fs.readFile('./inputs.txt', 'utf8', (err, data) => {
      if (err) throw err;
      inputs = new Map(eval(data));
      done();
    });
  });

  describe('is_null_input()', function () {
    it('should return a json string', function () {
      const is_null_input = inputs.get('is_null_input');
      expect(is_null_input).to.equal(true);  // Success!
      // ...
      // var json_result = scrapper_cheerio.is_null_json(is_null_input);
      // console.log('these are json results', json_result);
      // assert.isObject(json_result, 'is json object');
    });
  });

});
  

Подробные сведения

Цикл выполнения Mocha сначала выполняет все describe обратные вызовы, а describe обратные вызовы всегда выполняются синхронно (вы не можете использовать done , async функцию или возвращать Promise в describe обратном вызове).

Итак, эта строка:

 const is_null_input = inputs.get('is_null_input');
  

…был запущен до before , то есть inputs все еще null .

Перемещение этого кода внутрь теста означает, что он будет выполняться после определения before и inputs .

Рекомендуется не блокировать цикл событий JavaScript с помощью readFileSync , поэтому в приведенном выше примере используется done в сочетании с readFile .