javascript - text() 方法在 Blob 中不可用

标签 javascript axios jestjs blob nock

我正在使用 jest 进行一些集成测试& nock测试Axios interceptors链接。
在其中一个中,我希望收到一个 Blob 实例
并根据 this link ,我应该可以使用它的 text() 方法。
我的问题是:为什么没有定义这个方法?(在我的测试中)

这是(简化的)代码:

// interceptors.js
const useBlobTextProperty = async (response) => {
  const { data: myBlob } = response
  console.log(myBlob.toString())          // Prints "[object Blob]"
  response.rawText = await myBlob.text()  // TypeError: myBlob.text is not a function
  return response
}
// foo.test.js
import axios from 'axios'
import httpAdapter from 'axios/lib/adapters/http'
import nock from 'nock'

const testAxios = axios.create({
  responseEncoding: 'utf8',
  responseType: 'blob',
})
testAxios.interceptors.response.use(useBlobTextProperty, null)

const host = 'http://localhost'

axios.defaults.host = host
axios.defaults.adapter = httpAdapter

describe('SO test', () => {
  beforeEach(() => {
    nock(host)
      .defaultReplyHeaders({ 'Content-Type': 'application/json' })
      .persist()
      .get('/')
      .reply(200, { foo: 17 })
  })
  afterEach(() => {
    nock.cleanAll()
  })

  it('should get raw text', async () => {
    const returnValue = await testAxios.get('/') // FAIL: TypeError
    expect(returnValue.rawText).toEqual('{"foo":17}')
  }, 1000)
})

仅供引用,为了解决这个问题,我正在使用另一个拦截器:

// interceptors.js
const addMissingTextPropertyToBlob = (response) => {
  const { data } = response
  if (data.toString() === '[object Blob]' && !data.text) {
    data.text = () =>
      new Promise((resolve, reject) => {
        const reader = new FileReader()
        reader.onload = () => { resolve(reader.result) }
        reader.onerror = (error) => { reject(error) }
        reader.readAsText(data)
      })
  }
  return response
}
// foo.test.js
// Response interceptors are executed from index 0 to N-1
testAxios.interceptors.response.use(addMissingTextPropertyToBlob, null)
testAxios.interceptors.response.use(useBlobTextProperty, null)
// Then, it works!

但我想了解为什么我不能在测试中依赖 Blob.text()

最佳答案

就我而言,这种方法对我有用:

yarn add blob-polyfill -D

然后在您的 jest setupTests 中导入以下内容:

导入 'blob-polyfill';

关于javascript - text() 方法在 Blob 中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65328150/

相关文章:

javascript - 页面刷新后按钮应保持禁用状态

axios - Moxios:如何访问单元测试中不是最新的请求

javascript - 如何在任何测试失败时运行函数 - Jest

visual-studio-code - Jest Puppeteer - 为其设置 Visual Studio Code

reactjs - 测试库 React 在异步后不会触发点击

javascript - 如何使用 jquery 验证按钮单击时的多个文本框

javascript - jQuery .hover() 仅适用于 FireFox

javascript - 无法在 Vue 2 和 Axios API 调用上设置实例属性

http ://mysite. com 与 http ://www. mysite.com 的 JavaScript 问题

javascript - 在 While 循环或类似循环中运行 GET 请求