在node.js中编写单元测试的最佳方法是什么?

时间:2016-05-13 18:13:35

标签: javascript node.js unit-testing mocha chai

我有一个模块,我加载胡子模板文件。我想为此写一个单元测试。我正在尝试使用mocha,chai和rewire。

这是我的module.js:

var winston = require('winston');
var fs = require('fs');
var config = require('./config.js');
exports.logger = new winston.Logger({
    transports: [
        new winston.transports.File(config.logger_config.file_transport),
        new winston.transports.Console(config.logger_config.console_transport)
    ],
    exitOnError: false
});
exports.readTemplateFile = function(templateFile, callback) {
        fs.readFile(config.base_directory + templateFile + '.tpl.xml', 'utf8', function (err, data) {
            if (err) {
                logger.error('Could not read template ' + templateFile + ': ' + err);
            }
            callback(data);
        });
    };

在回调函数中,我使用小胡子对模板做一些事情。 测试这个的最佳方法是什么?

也许我必须重新连接fs.readFile?当测试执行时,文件将不存在。 Winston记录器也是一个有趣的部分我猜,如果我在mocha测试中导入它,不确定它是否会被初始化。我的第一个测试显示记录器未定义。

1 个答案:

答案 0 :(得分:3)

最重要的单元测试原则之一是测试非常小的代码。要实现这一点,你绝对应该模拟或存根调用不属于测试代码的函数(在本例中为readFile和logger.error)。对于提供的代码,您可以创建三个测试用例:

  • 使用适当的参数调用readFile
  • 如果存在错误则调用错误
  • 使用适当的参数调用回调函数

您的回调函数应在此代码之外进行测试,例如通过提供假数据作为参数:

define('Some test', () => {
    it('should return true', () => {
    expect(callbackFunction('fakeData').to.be.ok);
  });
});