首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jest模拟FS文件流

Jest模拟FS文件流
EN

Stack Overflow用户
提问于 2021-04-23 00:05:08
回答 1查看 785关注 0票数 1

我对jest和mocking非常陌生,我有一个fs模块读取流,它有2个事件和数据,我试着模仿下面的代码

ReadFile.js

代码语言:javascript
运行
复制
const csv = require('csv-parser');
let storeData=[];
csvFileReader() {
        fs.createReadStream(path.resolve(__dirname, "./abc.csv"))
            .pipe(csv())
            .on('data',  async (row) => {
                 
                storeData[0] = row.postcode;
            })
            .on('end', () => {              
                console.log('Done')
            });
    }

ReadFileTest.js

代码语言:javascript
运行
复制
import ReadFile from './readFile.js';
const fs = require('fs');
jest.mock('fs');

describe('Load File', () => {
    const readFile= new ReadFile();

    test('Test data handler', async () => {
            

        const mockPipeOn = { on: jest.fn().mockImplementation(function(this, event, handler) {
            if (event === 'data') {
              jest.fn.mockReturnValueOnce("Reading Data")
            }
            if (event === 'end') {
              jest.fn.mockReturnValueOnce("Completed Reading Data")
            }
            return this;
          }), };
        const mockReadStream = { pipe: jest.fn().mockReturnValueOnce(mockPipeOn) };
        const createReadStream = jest.fn().mockReturnValueOnce(mockReadStream);
        await readFile.csvFileReader();
        
    });
});

我在'this‘关键字上遇到错误它没有进入'data’和'end‘错误处理程序

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-23 14:31:41

您应该使用mockFn.mockReturnThis()来返回上下文。

例如。

ReadFile.js

代码语言:javascript
运行
复制
import fs from 'fs';
import path from 'path';
import csv from 'csv-parser';

class ReadFile {
  csvFileReader() {
    fs.createReadStream(path.resolve(__dirname, './abc.csv'))
      .pipe(csv())
      .on('data', async (row) => {
        console.log('Storing Data');
      })
      .on('end', () => {
        console.log('Done');
      });
  }
}

export default ReadFile;

ReadFile.test.js

代码语言:javascript
运行
复制
import ReadFile from './ReadFile';
import fs from 'fs';

jest.mock('fs');

describe('67216891', () => {
  const readFile = new ReadFile();

  it('should store', () => {
    const mReadStream = {
      pipe: jest.fn().mockReturnThis(),
      on: jest.fn().mockImplementation(function (event, handler) {
        handler();
        return this;
      }),
    };
    fs.createReadStream.mockReturnValueOnce(mReadStream);
    readFile.csvFileReader();
    expect(fs.createReadStream).toBeCalledTimes(1);
    expect(mReadStream.pipe).toBeCalledTimes(1);
    expect(mReadStream.on).toBeCalledWith('data', expect.any(Function));
    expect(mReadStream.on).toBeCalledWith('end', expect.any(Function));
  });
});

测试结果:

代码语言:javascript
运行
复制
 PASS  examples/67216891/ReadFile.test.js (8.891 s)
  67216891
    ✓ should store (20 ms)

  console.log
    Storing Data

      at ReadFile.<anonymous> (examples/67216891/ReadFile.js:10:17)

  console.log
    Done

      at examples/67216891/ReadFile.js:13:17

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |     100 |      100 |     100 |     100 |                   
 ReadFile.js |     100 |      100 |     100 |     100 |                   
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        10.159 s
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67216891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档