【问题标题】:How to simulate error returned from fs.readFile for testing purposes?如何模拟从 fs.readFile 返回的错误以进行测试?
【发布时间】:2015-08-29 02:40:27
【问题描述】:

我是测试驱动开发的新手,正在尝试为我的应用程序开发自动化测试套件。

我已经成功编写了测试来验证从成功调用 Node 的 fs.readFile 方法收到的数据,但是正如您将在下面的屏幕截图中看到的那样,当我使用 istanbul 模块测试我的覆盖范围时,它正确显示我没有测试了从 fs.readFile 返回错误的情况。

我该怎么做?我有一种预感,我必须模拟一个文件系统,我曾尝试使用 mock-fs 模块,但没有成功。文件的路径在函数中是硬编码的,我正在使用 rewire 从我的应用程序代码中调用未导出的函数。因此,当我使用 rewire 的 getter 方法访问 getAppStatus 函数时,它使用真正的 fs 模块,因为它是在 getAppStatus 所在的 async.js 文件中使用的。

这是我正在测试的代码:

// check whether the application is turned on
function getAppStatus(cb){
  fs.readFile(directory + '../config/status.js','utf8', function(err, data){
    if(err){
      cb(err);
    }
    else{
      status = data;
      cb(null, status);
    }
  });
}

这是我为返回数据的情况编写的测试:

  it('application should either be on or off', function(done) {
      getAppStatus(function(err, data){
        data.should.eq('on' || 'off')

        done();
      })
  });

我使用 Chai 作为断言库并使用 Mocha 运行测试。

非常感谢任何帮助我模拟从 fs.readFile 返回的错误,以便我可以为此场景编写测试用例。

【问题讨论】:

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


    【解决方案1】:

    最好使用mock-fs,如果你不提供文件,它会返回ENOENT。 请注意在测试后调用 restore 以避免对其他测试产生任何影响。

    在开头添加

      var mock = require('mock-fs');
    

    还有测试

    before(function() {
      mock();
    });
    it('should throw an error', function(done) {
      getAppStatus(function(err, data){
        err.should.be.an.instanceof(Error);
        done();
      });
    });
    after(function() {
      mock.restore();
    });
    

    【讨论】:

    • 太棒了,感谢您的帮助,我能够在几分钟内使用我的测试套件让它工作。当我得到这个应用程序的其余部分时,我肯定会遇到更多的障碍,希望当我遇到那些肯定会出现的混乱时,我可以再次以你的方式提出问题。再次感谢您的帮助! :)
    猜你喜欢
    • 2020-05-04
    • 2013-10-09
    • 1970-01-01
    • 2018-02-15
    • 2015-03-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多