【问题标题】:Mocha Typescript test doesn't print Console.logMocha Typescript 测试不打印 Console.log
【发布时间】:2019-03-14 18:32:26
【问题描述】:

我已经在 Node 中使用 mocha、chai、typescript 设置了我的测试:

import chai = require('chai');
import chaiAsPromised = require('chai-as-promised');
import ReadLine = require('readline');
import FS = require('fs');

before((done) => {
    chai.should();
    chai.use(chaiAsPromised);
    done();
});


describe("Test", function() {
    this.timeout(20000);
    let testFile: string [] = [];

    before((done) => {
        let lineReader = ReadLine.createInterface({
            input: FS.createReadStream("MyFile.txt")
        });

        lineReader.on('line', function (line) {
            testFile.push(line);
        });
        done();
    });
    it("test", () => {
        for(let i=0;i<testFile.length;i++){
            let curLine = testFile[i];
            console.log(curLine);
        }
    }).timeout(30000);
});

然后我像这样运行我的测试:

C:\Repository\Folder>npm test

> Test@0.0.1 test C:\Repository\Folder
> mocha -r ts-node/register -R spec test/**/*.ts



  Test
    √ test


  1 passing (16ms)

所以它似乎通过了,但它没有打印到控制台,我做错了什么?

【问题讨论】:

    标签: node.js typescript mocha.js chai


    【解决方案1】:

    问题出在这段代码上:

    lineReader.on('line', function (line) {
        testFile.push(line);
    });
    done();
    

    您的 ReadLine 阅读器异步工作。您附加一个监听器,在读取任何行之前,done() 已经被调用,因为它是事件循环中的下一个条目。

    要修复它,请等待阅读器关闭:

    import chai = require('chai');
    import chaiAsPromised = require('chai-as-promised');
    import ReadLine = require('readline');
    import FS = require('fs');
    
    before((done) => {
        chai.should();
        chai.use(chaiAsPromised);
        done();
    });
    
    
    describe("Test", function() {
        this.timeout(20000);
        let testFile: string [] = [];
    
        before((done) => {
            let lineReader = ReadLine.createInterface({
                input: FS.createReadStream("MyFile.txt")
            });
    
            lineReader.on('line', function (line) {
                testFile.push(line);
            });
            linereader.on('close', () => done()); // <===== 
        });
        it("test", () => {
            for(let i=0;i<testFile.length;i++){
                let curLine = testFile[i];
                console.log(curLine);
            }
        }).timeout(30000);
    });
    

    【讨论】:

      【解决方案2】:

      你需要在for循环之后使用done():

      it("test", (done) => {
          for(let i=0;i<testFile.length;i++){
              let curLine = testFile[i];
              console.log(curLine);
          }
      
        done();
      }).timeout(30000);
      

      【讨论】:

      • 很遗憾,这并没有什么不同。
      • before() 中移动done(); 内部lineReader.on('line') 回调,就在testFile.push(line); 之后,以便等到testFile 将被设置
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2019-04-05
      • 2020-08-08
      • 2020-05-15
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多