text() 方法在 Blob 中不可用

fse*_*dev 3 javascript blob jestjs nock axios

我正在使用jest&进行一些集成测试nock来测试Axios 拦截器链接。
在其中一个中,我期望收到一个Blob实例
,根据此链接,我应该能够使用它的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
}
Run Code Online (Sandbox Code Playgroud)
// 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)
})
Run Code Online (Sandbox Code Playgroud)

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

// 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
}
Run Code Online (Sandbox Code Playgroud)
// 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!
Run Code Online (Sandbox Code Playgroud)

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

Was*_*aga 8

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

yarn add blob-polyfill -D

然后在你的笑话中导入以下内容setupTests

import 'blob-polyfill';