如何使用 jest/enzyme 模拟 multer 以使用 axios 后模拟调用进行文件上传

2024-01-08

我正在测试我的快速路由器axios调用后到后端。我正进入(状态500响应而不是 200,不知道如何嘲笑multer有效地。 对此有什么想法吗?谢谢

路线.jsx

const axios = require('axios')
const router = express.Router()
const multer = require('multer')
const FormData = require('form-data')
const express = require('express')

const upload = multer({ storage: multer.memoryStorage() }).any()

router.post('/', upload, (req, res) => {
  const formData = new FormData()
   const { body } = req 
    req.files.forEach(file => {
      formData.append(
        'files',
        file.buffer,
        {
          filename: file.originalname
        },
        file.originalname
      )
    })


  axios
    .post('/api/endpoint', formData)
    .then(response => {return response
    })
    .catch(e => {
    console.log(e)
    })
})

module.exports = router

下面是我的测试用例

路由.jsx.测试

const axios = require('axios')
const MockAdapter = require('axios-mock-adapter')
const myroute = require('myroute')
const app = express()
const mock = new MockAdapter(axios)
const request = require('supertest')
const express = require('express')
const bodyParser = require('body-parser')
const multer = require('multer')
jest.mock('multer')

multer.mockImplementation(() => {
  return {
    any () {
      return (req, res, next) => {
        req.body = { userName: 'testUser' }
        req.files = [
          {
            originalname: 'sample.name',
            mimetype: 'sample.type',
            path: 'sample.url'
          }
        ]
        return next()
      }
    }
  }
})
app.use(bodyParser.json())

app.use('/', myroute)

describe('sendFiles', () => {
  const url = '/api/endpoint'  

  test('200 response', () => {
    const myMockRes = { mykey: 'myVal' }
    let formData = new FormData()
    const file = new Blob(['somee contents'], { type: 'multipart/form-data' })
    formData.append('files', file)
    formData.append('userName', 'testUser')
    mock.onPost(url).reply(200, myMockRes)
    return (
      request(app)
        .post('/')
        .send({ userName: 'testUser', files: [file] })
        //.expect('Content-Type', /json/)
        .expect(200)
        .then(response => {
          const { data } = response.body
          expect(data).toEqual(myMockRes)
        })
    )
  })


})

error:

TypeError: Cannot read property 'any' of undefined in routes.jsx

const upload = multer({ storage: multer.memoryStorage() }).any()
    

当你使用jest.mock('multer'), Jest 自动模拟模块并返回undefined当它在测试中被调用时。既然我们想嘲笑memoryStorage and any方法也是如此,我们必须通过将工厂作为第二个参数传递给jest.mock https://jestjs.io/docs/en/jest-object#jestmockmodulename-factory-options.

jest.mock('multer', () => {
  const multer = () => ({
    any: () => {
      return (req, res, next) => {
        req.body = { userName: 'testUser' }
        req.files = [
          {
            originalname: 'sample.name',
            mimetype: 'sample.type',
            path: 'sample.url',
            buffer: Buffer.from('whatever'), // this is required since `formData` needs access to the buffer
          },
        ]
        return next()
      }
    },
  })
  multer.memoryStorage = () => jest.fn()
  return multer
})

另一个问题是Blob节点中不存在。您可以使用Buffer.from https://nodejs.org/api/buffer.html#buffer_static_method_buffer_from_string_encoding生成一个缓冲区以在请求中发送。

const file = Buffer.from('whatever')

而且你不需要使用FormData在测试中。

整个代码:

// router.test.js

const axios = require('axios')
const MockAdapter = require('axios-mock-adapter')
const express = require('express')
const app = express()
const mock = new MockAdapter(axios)
const request = require('supertest')

const bodyParser = require('body-parser')

const myroute = require('./router')

jest.mock('multer', () => {
  const multer = () => ({
    any: () => {
      return (req, res, next) => {
        req.body = { userName: 'testUser' }
        req.files = [
          {
            originalname: 'sample.name',
            mimetype: 'sample.type',
            path: 'sample.url',
            buffer: Buffer.from('whatever'),
          },
        ]
        return next()
      }
    },
  })
  multer.memoryStorage = () => jest.fn()
  return multer
})

app.use(bodyParser.json())

app.use('/', myroute)

describe('sendFiles', () => {
  const url = '/api/endpoint'

  test('200 response', () => {
    const myMockRes = { mykey: 'myVal' }
    const file = Buffer.from('whatever')
    mock.onPost(url).reply(200, myMockRes)
    return request(app)
      .post('/')
      .send({ userName: 'testUser', files: [file] })
      .expect(200)
      .then((response) => {
        const { data } = response.body
        expect(data).toEqual(myMockRes)
      })
  })
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 jest/enzyme 模拟 multer 以使用 axios 后模拟调用进行文件上传 的相关文章

  • 监听文件夹和文件(更改)

    可以直接在 PHP 或 Node 上监听文件夹和文件的更改 通过事件 还是我需要创建自己的方法来执行此操作 Example 我需要听文件夹 user 如果我将一些文件添加到该目录中 PHP 或 Node 会收到信息并运行PathEvent
  • 使用socket.io进行用户身份验证

    我已经红色了这个教程 http howtonode org socket io auth http howtonode org socket io auth 它展示了如何使用express和socket io对用户进行身份验证 但是有没有一
  • Jwt 签名和前端登录身份验证

    我有这个特殊的 jwt sign 函数 Backend const token jwt sign id user id process env TOKEN SECRET expiresIn 1m res header auth token
  • 使用cheerio 检索href

    我有一个下载的 html 文件 看起来像这样 div div div div style height 11px color white font size 9px font weight bold div div style border
  • HTML 格式的 Google Apps 脚本

    是否可以在我的 HTML 中使用 google apps 脚本 我希望能够从外部框架 例如 Node js 以纯 Javascript 形式从表单写入电子表格 https developers google com apps script
  • 如何使用 sinon/mocha 模拟 npm 模块

    我正在尝试测试调用该模块的函数cors 我想测试一下cors会被称为 为此 我必须存根 模拟它 这是函数 cors js const cors require cors const setCors gt cors origin http l
  • 在 Node 中使用 Babel 导入与请求 [重复]

    这个问题在这里已经有答案了 我想在一个文件中导入一个类 use strict import models from model class Foo bar export default new Foo 当我使用导入时它有效 例如 impor
  • Chrome/Firefox 在后台发送两个 POST,间隔恰好 5 秒,仅调用一次来获取 Nodejs 8.0.0 服务器

    注意 这不是飞行前选项 也不是网站图标或其他类似内容 实际上是 2 个帖子 下面有一个屏幕截图可以更清楚地显示这一点 我的规格 版本 macOS 塞拉利昂版本 10 12 3 Chrome 版本 61 0 3128 0 官方版本 开发版 6
  • 如何解决 Socket.io 404(未找到)错误?

    我正在使用 Socket io 和 Express 在我的项目中 我有一个登录页面和一个主页 当我成功登录时 我导航到 localhost 3000 home 并收到以下错误 GET http localhost 3000 socket i
  • Node.js 重写 toString

    我试图覆盖我的对象的默认 toString 方法 这是代码和问题 function test this code 0 later on I will set these this name test prototype toString f
  • 如何在 Sequelize ORM 中限制连接行(多对多关联)?

    Sequelize 定义了两种模型 具有多对多关联的 Post 和 Tag Post belongsToMany db Tag through post tag foreignKey post id timestamps false Tag
  • firebase 和 firebase-admin npm 模块有什么区别?

    我想使用 Firebase 身份验证 数据库和存储 构建 Node js Web 应用程序 但我对应该使用哪个模块感到困惑 firebase or firebase 管理员 或两者 管理 SDK 运行您的代码管理权限 https fireb
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • Nodejs Express中间件函数返回值

    我正在使用 NodeJS 和 Express 我有以下路线 中间件功能是Mobile 如果我不使用 return next 在 isMobile 函数中 应用程序会卡住 因为 NodeJS 不会移至下一个函数 但我需要 isMobile 函
  • 在heroku上部署时出错,/bin/sh: 1: webpack: not found

    这是我在 heroku 网站上手动部署时遇到的错误 首先 我在 json 文件中遇到错误 因此我指定了正在运行的 npm yarn 和 node 版本 这些错误似乎已经清除 现在我就是这样的人 并且已经搜索了谷歌 但似乎找不到太多关于修复它
  • 在node.js中加载并执行外部文件

    从另一个节点js文件运行一个节点js文件是否容易 可能 例如 我有两个文件 test1 js 和 test2 js 我想从 test2 js 执行 test1 js 文件 我认为完成你想做的事情的更好方法是按照我的其他答案建议的去做 但是要
  • 消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

    我正在使用 Puppeteer 和 Jest 来运行一些前端测试 我的测试如下 describe Profile Tab Exists and Clickable settings user gt test Assert that you
  • 具有 Firebase (FCM) 推送通知的 Node js

    我正在使用 Node js 开发 REST api 并且有一个休息端点来发送 firebase 推送通知 我的代码如下 const bodyParser require body parser var cors require cors v
  • 如何检查请求是否通过 Express 中的 https 发送

    我想强制某些路线始终在我的 Express 应用程序中使用安全连接 我如何检查以确保它使用 https 我在 heroku 上使用搭载 ssl 进行部署 我也在 Heroku 上部署 当他们使用 nginx 进行反向代理时 他们添加了一堆标
  • 如何使用 Passport 验证 Supertest 请求?

    我使用 Passport js 进行身份验证 本地策略 并使用 Mocha 和 Supertest 进行测试 如何使用 Supertest 创建会话并发出经过身份验证的请求 正如 zeMirco 指出的那样 底层superagent模块支持

随机推荐

  • OpenGL Bindless 纹理:绑定到统一的sampler2D 数组

    我正在研究使用无绑定纹理来快速显示一系列图像 我的参考是OpenGL 4 5红皮书 这本书说我可以使用这个片段着色器在着色器中采样无绑定纹理 version 450 core extension GL ARB bindless textur
  • 我可以为 .NET Windows 窗体窗口中的工具提示设置无限的 AutoPopDelay 吗?

    我要求没有标准 NETWindows 窗体 http en wikipedia org wiki Windows Forms工具提示自动隐藏 也就是说 我需要它们保持可见 直到鼠标移离具有工具提示的控件 我想避免对带有工具提示的所有控件使用
  • 使用逗号分隔符将 Spark DataFrame 中的一列拆分为多列

    我想从一列创建多列Dataframe在 Java Spark 中使用逗号分隔符 我在其中一列中有一个带有逗号的值DataFrame并希望使用逗号分隔符分成多列 我有以下代码 Dataset
  • 强制堆分配超过 4 GB

    同事将 32 位 C 应用程序转换为 64 位 出于测试目的 现在的想法是指示堆管理器仅返回 64 位范围内的地址 在网上搜索解决方案似乎并没有给出非常可靠的结果 MSDN 论坛 https social msdn microsoft co
  • Android:没有历史记录的 ShareActionProvider

    根据Android文档 如果我不希望我的ShareActionProvider保留我应该调用的共享历史记录 mShareActionProvider setShareHistoryFileName null 但是 当我这样做时 在选择共享选
  • 为什么将字节数组转换为字符串然后再转换回字节数组时长度不同?

    我有以下 Java 代码 byte signatureBytes getSignature String signatureString new String signatureBytes UTF8 byte signatureString
  • 无法创建 IBAction ctrl-drag UIButton 到 ViewController(Xcode 版本 7.2)

    在我创建应用程序的过程中 xcode 不再允许我按住 Ctrl 键并将 UIButton 拖动到 VC 来创建 IBAction 每个 VC 都会发生这种情况 总共九个 不过 它确实允许创建 Outlet 请查看图片 gt 没有显示任何操作
  • 如何将DataTemplate数据类型绑定到接口?

    我正在编写一个复合松散耦合的 MVVM WPF 应用程序 父 VM 中的子 VM 是接口而不是类实例 例如 public IChildViewModel get set 现在如何使用 DataTemplate 呈现此属性 喜欢
  • 等宽的垂直按钮

    这是两个垂直排列的按钮 我需要它们的宽度相等 我不知道 包装的尺寸是多少 按钮上将显示什么文本 因此我不能使用像素宽度 按钮的宽度是多少 按钮必须位于左侧 按钮上的文本必须居中对齐 我不能使用 100 宽度 因为它不美观 我无法使用 Fle
  • 居委会集体——减少运营

    我需要 allreduce MPI Ineighbor allreduce 来进行 MPI 中的集体通信 遗憾的是它尚未包含在内 明显但效率不高的解决方案是使用 MPI Neighbor alltoall 以增加缓冲区大小为代价 您有什么建
  • 如何在不刷新页面的情况下“连续”更改背景颜色[重复]

    这个问题在这里已经有答案了 有没有办法像彩虹一样不断改变背景颜色 希望你需要这样的东西 var body body var colors red green blue yellow pink purple var currentIndex
  • CSS 溢出原理

    Mozilla 对 overflow 属性的描述 将一个轴设置为可见 默认 同时将另一个轴设置为不同的值会导致可见行为为自动 我看不出这样做有任何好处 也看不到由此可以避免的任何问题 为什么是规范的这一部分 考虑这个例子 我们在两个方向上都
  • 如何减去 IEEE 754 数字?

    如何减去 IEEE 754 数字 例如 0 546875 32 875 gt 0 546875 是 IEEE 754 中的 0 01111110 10001100000000000000000 gt 32 875 在 IEEE 754 中是
  • 在外部单击时如何使用和关闭 PopupWindow?

    我目前正在使用以下方法设计简单的提示弹出窗口弹出窗口 http developer android com reference android widget PopupWindow html班级 当在内容之外单击时 我可以关闭弹出窗口 然而
  • 如何更改两个字段中的默认“请填写此字段”

    我想在两个字段中显示两条不同的消息 例如 用户名和密码字段包含 用户名不能为空 和 密码不能为空 等消息 我只设法更改了消息 但两个字段的消息都是相同的 它是here http jsfiddle net Godfather 5fp4Y 4
  • Active Directory Web 服务 (ADWS) SDK

    我最近了解到 WCF 有针对 Active Directory 的 Web 服务 我认为这与 LDAP 无关 是否有任何相关文档或博客介绍默认端点是什么或 API 是什么样子 或者它是否以 SOAP 进行交流 或者您能否介绍一下如何连接到
  • 使用 wpf 4 打印的最佳方法

    你好 我需要能够从我的 wpf 应用程序进行打印 我只是想打印交易收据 我发现使用 PrintDialog pDialog new PrintDialog pDialog PrintVisual new Receipt 交易名称 我的商店
  • 有没有可能的方法将指纹生物识别设备连接到网站..?

    有没有可能的方法将指纹生物识别设备连接到网站 我创建了一个基于网络的 ERP 系统 根据客户要求 我需要集成指纹记录系统 我的网站是用 C 和 angular2 开发的 我尝试了很多 sdk 但没有任何效果符合我的预期 它唯一可行的方法是使
  • 如何在 Scrapy .csv 结果中获取双引号

    我在使用 Scrapy 的输出中遇到引用问题 我试图废弃包含逗号的数据 这会导致某些列中出现双引号 如下所示 TEST TEST TEST ON TEST TEST 2 449 000 4 735 Sq Ft 6 Bed 5 1 Bath
  • 如何使用 jest/enzyme 模拟 multer 以使用 axios 后模拟调用进行文件上传

    我正在测试我的快速路由器axios调用后到后端 我正进入 状态500响应而不是 200 不知道如何嘲笑multer有效地 对此有什么想法吗 谢谢 路线 jsx const axios require axios const router e