使用 mocha 和 sinon 的 EventEmitter 单元测试不起作用

如何解决使用 mocha 和 sinon 的 EventEmitter 单元测试不起作用

我的代码“expect(spy.Called).to.be.true”的部分应该是真的。但是测试结果是这样的。

  AssertionError: expected false to be true
  + expected - actual

  -false
  +true

我尝试用 mocha 对 EventEmitter 进行单元测试。很快,我意识到我需要检查监听器函数是否被调用。所以我导入了 sinon 模块。但我所期望的一切都没有发生在我身上。 我的代码如下。请让我知道我的代码有什么问题。非常感谢。

const findPattern = require('./findPatterns');
const expect = require('chai').expect;
const sinon = require('sinon');
const FakeTimers = require('@sinonjs/fake-timers');

describe('findPattern',function() {

  const sampleFiles = ['./sample/sample1.txt','./sample/sample2.txt','./sample/sample3.txt'];
  const regEx = /[0-9]+/g;

  it('findPattern',function() {
    const clock = FakeTimers.createClock();

    const o = {
      f: (file) => console.log('Read from ' + file)
    };

    const spy = sinon.spy(o,"f");

    findPattern(sampleFiles,regEx)
      .on('error',(err) => console.log('error: ' + err))
      .on('read',spy)
      .on('found',(file,match) => console.log('Matched ' + match + ' in file' + file));

    clock.setTimeout(function() {
      expect(spy.called).to.be.true;
    },1000);

    clock.tick(1000);
  });
});

const EventEmitter = require('events');
const fs = require('fs');

function findPattern(files,regex) {
  const emitter = new EventEmitter();

  files.forEach(function(file) {
    fs.readFile(file,"utf-8",(err,content) => {
      if (err) {
        return emitter.emit('error',err);
      }

      emitter.emit('read',file);

      const matches = content.match(regex);
      if (matches) {
        matches.forEach(i => {
          emitter.emit('found',file,i);
        });
      }
    }); 
  });

  return emitter;
}

module.exports = findPattern;

解决方法

好吧,我想我找到了一种解决方案。我想问题出在异步问题上。 “期望函数”似乎在完成读取文件之前被调用。 所以我改变了我的代码并得到了我预期的结果。顺便说一下,计时器功能似乎无法正常工作。如果我做错了什么,请检查我更改的代码并提供一些建议。

const findPattern = require('./findPatterns');
const expect = require('chai').expect;
const sinon = require('sinon');

describe('findPattern',function() {
  const sampleFiles = ['./sample/sample1.txt','./sample/sample2.txt','./sample/sample3.txt'];
  const regEx = /[0-9]+/g;
  
  const readFun = (file) => console.log('Read from ' + file);
  const o = {
    f: readFun
  };

  const spy = sinon.spy(o,"f");

  beforeEach(function(done) {
    findPattern(sampleFiles,regEx,done)
      .on('error',(err) => console.log('error: ' + err))
      .on('read',spy)
      .on('found',(file,match) => console.log('Matched ' + match + ' in file' + file));
  });

  it('findPattern',function() {
    expect(spy.called).to.be.true;
  });
});
const EventEmitter = require('events');
const fs = require('fs');

function readFile(file,regex,emitter,callback) {
  fs.readFile(file,"utf-8",(err,content) => {
    if (err) {
      return emitter.emit('error',err);
    }
    
    emitter.emit('read',file);
    
    const matches = content.match(regex);
    if (matches) {
      matches.forEach(i => {
        emitter.emit('found',file,i);
      });
    }

    callback();
  }); 
}

function findPattern(files,done) {
  const emitter = new EventEmitter();

  let completed = 0;

  function finish() {
    if (++completed == files.length) {
      return done();
    } 
  }

  files.forEach(function(file) {
    readFile(file,finish);
  });

  return emitter;
}

module.exports = findPattern;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?