【问题标题】:Mocking specific reading file error for tests in Node.js在 Node.js 中为测试模拟特定的读取文件错误
【发布时间】:2018-11-16 08:07:14
【问题描述】:

是否可以使用"mock-fs" 库模拟某种读取文件错误?特别想测试一下这种情况(code !== 'ENOENT'):

fs.readFile(filePath, (err, data) => {
    if (err) {
        if (err.code !== 'ENOENT') { 
            return done(new ReadingFileError(filePath));
        }
    }
    // ... 
});

我找不到任何关于在他们的文档中模拟阅读错误的信息。也许还有其他一些库可以做到这一点。

【问题讨论】:

    标签: node.js unit-testing mocking fs


    【解决方案1】:

    据我所知mock-fs 模拟文件系统而不是节点实用程序。当然在某些情况下您可以使用它来测试 fs 实用程序,但我认为您的用例不在其中。

    这是sinon.sandbox 的示例

    一些替代方案是:

    请注意,我有点困惑ReadingFileError 的来源,所以我猜您正在尝试实现自定义错误。如果是这种情况,也许this 也会有所帮助。在示例中,我将其替换为简单的new Error('My !ENOENT error')

    // readfile.js
    'use strict'
    
    const fs = require('fs')
    
    function myReadUtil (filePath, done) {
      fs.readFile(filePath, (err, data) => {
        if (err) {
          if (err.code !== 'ENOENT') {
            return done(err, null)
          }
          return done(new Error('My ENOENT error'), null)
        }
        return done(null, data)
      })
    }
    
    module.exports = myReadUtil
    
    // test.js
    'use strict'
    
    const assert = require('assert')
    const proxyquire = require('proxyquire')
    
    const fsMock = {
      readFile: function (path, cb) {
        cb(new Error('My !ENOENT error'), null)
      }     
    }
    
    
    const myReadUtil = proxyquire('./readfile', { 'fs': fsMock })
    
    myReadUtil('/file-throws', (err, file) => {
      assert.equal(err.message, 'My !ENOENT error')
      assert.equal(file, null)
    })
    

    编辑:重构示例以使用节点样式回调而不是throwtry/catch

    【讨论】:

    • ReadingFileError 是继承自Error 的自定义类。
    • 这是我假设的(见注释),但我没有它,所以我不能在示例中使用它。它不会改变任何东西:)
    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2020-02-13
    • 2017-03-04
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多