在Node.js中模拟特定读取文件错误

时间:2018-11-16 08:07:14

标签: node.js unit-testing mocking fs

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

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

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

1 个答案:

答案 0 :(得分:1)

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

以下是sinon.sandbox

的示例

一些替代方法是:

  

请注意,我有点困惑height的来源,所以我想您正在尝试实现自定义错误。如果是这种情况,那么this也可能会有所帮助。在示例中,我将其替换为简单的mock-fs

ReadingFileError

编辑:将示例重构为使用节点样式回调而不是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) })