如何用玩笑模拟 fs.readFileSync

Col*_*lin 5 javascript mocking node.js express jestjs

在我的 app.js 中我有这个函数:

const bodyParser = require('body-parser')
const express = require('express')
const app = express()
const cors = require('cors')
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
const dataFilePath = '../shoppinglist/data.json'
const baseUrl = '/api/v1/shoppingLists'
let client
const fileSystem = require('fs')
let data



app.post(baseUrl, (req, res) => {
    const newData = req.body
    if(newData != null && !isEmpty(newData) && isRequiredFieldGiven(newData)){
        readUpdatedData()
        newData.id = getNewestId()
        data.data.push(newData)
        //updateData(data)
        console.log(data)
        res.setHeader('Content-Type', 'application/json')
        res.statusCode = 201
        res.json({"Location" : baseUrl + '/' + newData.id})
    }else{
        res.statusCode = 400
        res.send()
    }
})

function readUpdatedData(){
    let rawData = fileSystem.readFileSync(dataFilePath)
    data = JSON.parse(rawData)
}
Run Code Online (Sandbox Code Playgroud)

在测试文件中,我这样做是为了测试一个使用 readUpdatedData 的 API post 调用:

const request = require('supertest')
const shoppingListDataPath = ('../shoppinglist/data.json')
const baseUrl = '/api/v1/shoppingLists'
const appPath = '../src/app'

describe('create list entry', () => {
it('should return 201', async () => {
   let fs = require('fs')
 jest.spyOn(fs, 'readFileSync').mockReturnValueOnce(JSON.stringify({"some" : "data"}))

    let {app} = require(appPath)
        const entry = {
            "id": 1,
            "name": "filled shopping list2",
            "location": "lidl2",
            "targetDate": "22.03.1986",
            "priority": 1,
            "isFinished": false,
            "items": [{"count": 1, "name": "vodka"}, {"count": 1, "name": "vodka"}
            ]
        }
        const res = await request(app)
            .post(baseUrl)
            .send(entry)
        expect(res.statusCode).toEqual(201)
        expect(res.body).toEqual({"Location": baseUrl + 1})
    })
})
Run Code Online (Sandbox Code Playgroud)

当我使用mockImplementationOnce 或mockReturnValueOnce 时,我在调用readFileSynch 时收到错误500。我已将其更改为mockImplementation或/和mockReturnValue,然后出现错误400。它不会调用app.post all。

我也尝试过 jest.fn() 但结果相同。

Ana*_*oly 7

mock('modulename')模拟模块需要像这样调用:

jest.mock('fs');
Run Code Online (Sandbox Code Playgroud)

请参阅模拟模块手动模块模拟

  • 将 `jest.spyOn(fs, 'readFileSync').mockReturnValueOnce(JSON.stringify({"some" : "data"}))` 替换为 `fs.readFleSync.mockResolvedValue(JSON.stringify({"some" : "data") “}));` (2认同)