node.js - 使用 Mocha、Chai 和 Sinon 对 Node.js 应用程序进行单元测试

标签 node.js unit-testing tdd sinon chai

我是 Node.js 应用程序单元测试的新手。我的应用程序经过一些过滤后将 CSV 文件转换为 JSON。

var fs = require('fs');
var readline = require('readline');

module.exports = ((year) => {
if (typeof year !== "number" || isNaN(year)){
    throw new Error("Not a number");
}
var rlEmitter = readline.createInterface({
  input: fs.createReadStream('./datasmall.csv'),
  output: fs.createWriteStream('./data.json')
});

rlEmitter.on('line', function(line) {
   /*Filter CSV line by line*/
});
rlEmitter.on('close', function() {
   /*Write to JSON*/
 });
});

我想对代码进行单元测试,特别是使用Sinon spy 、 stub 和模拟。例如,监视 createInterface,并且“close”事件的回调仅被调用一次。同样,“line”事件的回调被调用的次数与 csv 中的行数相对应。 另外,如果 CSV 在开发期间不存在,如何模拟 CSV?

我尝试过的一个测试是,但不确定这是否是正确的方法:

describe("Test createInterface method of readline", function(err){
    it("should be called only once", function() {
        var spyCreateInterface = sinon.spy(readline, 'createInterface');
        convert(2016);
        readline.createInterface.restore();
        sinon.assert.calledOnce(spyCreateInterface);
});

关于适当的单元测试以使该代码健壮的其他建议将受到高度赞赏。

最佳答案

当您尝试测试您的模块require的模块时,您可能希望使用类似 rewire 的内容。 “重新连接” require 调用。

var rewire = require("rewire");
var sinon = require("sinon");
var myModule = rewire("path/to/module");

describe("Test createInterface method of readline", function(err){
  it("should be called only once", function() {
    var readlineStub = sinon.stub();
    myModule.__set__("readline", readlineStub);
    myModule.convert(2016);
    sinon.assert.calledOnce(spyCreateInterface);
  });
});

关于node.js - 使用 Mocha、Chai 和 Sinon 对 Node.js 应用程序进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41829963/

相关文章:

独立脚本中的 javascript node.js,阻止/等待 promise

javascript - 如何为 Async.waterfall 数组 Node.js 中的函数编写单元测试

ruby - 有什么方法可以验证模拟或 stub 是否有效?

c# - 当所需代码几乎没有逻辑时,是否还会使用 TDD 编写测试?为什么?

node.js - 是否可以在 RTMP 协议(protocol)中为每个数据包插入额外的数据?

arrays - NodeJS/MongoDB - 将数组中的值与登录用户的值进行匹配

.net - 用 .NET 编写的 COM 单元测试

unit-testing - 使用 System.js 处理 css 导入的 React 组件的 Mocha 测试

ruby - 如何用 ruby​​ 开始 tdd 并出错?

node.js - Electron Framework 是否可以使用本地数据库文件?