Javascript 如何使用jest模拟fs.readFileSync
在我的app.js中,我有以下功能:Javascript 如何使用jest模拟fs.readFileSync,javascript,node.js,express,mocking,jestjs,Javascript,Node.js,Express,Mocking,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 = '../
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)
}
在测试文件中,我这样做是为了测试API post调用,该调用使用其中的ReadUpdateData:
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})
})
})
当我使用mockImplementationOnce或mockReturnValueOnce时,在调用ReadFileSync时出现错误500。
我将其更改为mockImplementation或/和mockReturnValue,然后出现错误400。它不会调用app.post all
我也尝试过jest.fn(),但结果相同。模拟模块需要调用
mock('modulename')
如下:
jest.mock('fs');
请参见和我需要在何时调用此功能?在让fs=require('fs')之前?这并不重要,因为在执行测试之前,Jest本身会在文件开头调用所有的
mock
。我更喜欢在require
之前指出mock
,因为它看起来更符合逻辑。现在它调用post函数,但当readFileSync时,我得到了这样的结果:enoint:没有这样的文件或目录,打开“../shoppinglist/data.json”Replacejest.spyOn(fs,'readFileSync').mockReturnValueOnce(json.stringify({“some”:“data”}))
withfs.readFleSync.mockResolvedValue(JSON.stringify({“some”:“data”}))代码>尝试使用fs.ReadFileSync编写一个简单的测试,就像我前面提到的文档一样