代码之家  ›  专栏  ›  技术社区  ›  Bill Software Engineer

Mocha Typescript测试不打印Console.log

  •  0
  • Bill Software Engineer  · 技术社区  · 6 年前

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

    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)
    

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   fjc    6 年前

    问题在于这段代码:

    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
  •  0
  •   vich    6 年前

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

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