【问题标题】:NodeJS testing writeFile with mock-fsNodeJS 使用 mock-fs 测试 writeFile
【发布时间】:2017-04-07 15:36:02
【问题描述】:

例如,我有以下文件:

spec/config/file-mock.js

var mock = require('mock-fs');
mock({
  'files': {
    'expense.csv': 'a;b;c;d\n1;2;3;4\n5;6;7;8'
  }
});

app/reader/reader.js

var fs = require('fs');
var reader = {
    read: function(path) {
        return fs.readFileSync(path, 'utf8');
    },
    write: function(path, object) {
        fs.writeFileSync(path, object);
    }
};
module.exports = reader;

app/reader/reader.spec.js

describe('reader.js test', function(){
    var reader = require('./reader.js');
    var mock = require('mock-fs');
    it('should return a simple string', function(){
        expect(reader.read('files/expense.csv')).toEqual('a;b;c;d\n1;2;3;4\n5;6;7;8');
    });
    it('should write a json object', function(){
        // WHAT TO DO?!
    });
});

reader.read 函数与mock-fs 一起工作正常。

但我正在尝试测试reader.write 函数,但我在文档中没有找到有关“写入”函数的任何内容。有人已经解决了这个问题吗?

【问题讨论】:

  • 你有没有尝试只做一个 reader.write,然后对 reader.read 做一个期望? reader.write('/temp/foo.txt', 'bar'); expect(reader.read('temp/foo.txt').toEqual('bar')
  • 在找到您的评论之前,我遇到了同样的问题。 Mock-fs 模拟整个 fs 模块,因此当您编写时,您实际上并不是在系统上编写,而是在 mock-fs 对象中编写。

标签: javascript node.js unit-testing mocking


【解决方案1】:

正如@Strech 在 cmets 中发布的那样,您可能会在调用 reader.write 以检查内容是否已写入假文件后尝试对 reader.read 进行期望。

恕我直言,有更好的方法来测试这个功能,更坚持单元测试原则。我们知道 fs 模块可以工作,因为它是节点核心模块的一部分并且在那里进行了测试,所以我们可以模拟 fs 方法并检查这些方法是否以预期的方式被调用参数,例如使用Sinon:

const Reader = require('../reader.js');
const sinon = require('sinon');
const fs = require('fs');
const expect = require('expect.js');

describe('reader.js test', function () {

  let readFileSync;
  let writeFileSync;

  beforeEach(() => {
    readFileSync = sinon.stub(fs, 'readFileSync').returns({});
    writeFileSync = sinon.stub(fs, 'writeFileSync').returns({});
  });
  afterEach(() => {
    readFileSync.restore();
    writeFileSync.restore();
  });

  it('should return a simple string', () => {

    Reader.read('files/expense.csv');
    expect(readFileSync.calledOnceWith('files/expense.csv', 'utf8')).to.be(true);
  });

  it('should write a json object', () => {

    Reader.write('files/expense.csv', 'test');
    expect(writeFileSync.calledOnceWith('files/expense.csv', 'test')).to.be(true);
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2021-09-10
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多