黄老师,这样的写法是否会存在隐患?

来源:12-8 请求模块单元测试 jasmine-ajax + 测试代码编写

Dolly_Zhang

2020-06-23

黄老师,今天学写request.spec.ts时发现:

Case 1:

describe('request', () => {
  beforeEach(() => {
    jasmine.Ajax.install()
  })

  afterEach(() => {
    jasmine.Ajax.uninstall()
  })

  test('should treat single string arg as url', () => {
    axios('/foo')

    return getAjaxRequest().then(request => {
      expect(request.url).toBe('/foo123') // 错误应被捕获
      expect(request.method).toBe('GET')
    })
  })

错误如预期般被捕获:
图片描述
图片描述

Case 2:

describe('request', () => {
  beforeEach(() => {
    jasmine.Ajax.install()
  })

  afterEach(() => {
    jasmine.Ajax.uninstall()
  })

  test('should resolve when validateStatus returns true', () => {
    const resolveSpy = jest.fn((res: AxiosResponse) => {
      return res
    })

    const rejectSpy = jest.fn((e: AxiosError) => {
      return e
    })

    axios('/foo', {
      validateStatus(status) {
        return status === 500
      }
    })
      .then(resolveSpy)
      .catch(rejectSpy)
      .then(next)

    return getAjaxRequest().then(request => {
      request.respondWith({
        status: 500
      })
    })

    function next(res: AxiosResponse | AxiosError) {
      expect(resolveSpy).toHaveBeenCalled()
      expect(rejectSpy).not.toHaveBeenCalled()
      expect(res.config.url).toBe('/foo123') // 错误应该被捕获
    }
  })
})

发现错误未被Jest捕获,Jest提示Tests Suites& Tests all passed. 倒是Node的unhandledRejection事件监听到了未捕获的reject错误,并提示UnhandledPromiseRejectionWarning
图片描述
图片描述
如果terminal输出多,不仔细在看,还真可能漏掉错误呢。黄老师这是不是会存在隐患?好像在异步测试中,expect放在被return的Promise对象的then方法里是最保险的?

写回答

1回答

ustbhuangyi

2020-06-23

说过了呀,异步需要 return Promise 或者用 done 函数

0
1
deerdevil
老师,上面的例子是否真的存在问题?return promise后case就完成了,那axios的then方法实际上是后面执行的吧 所以才全局输出了错误
2022-01-12
共1条回复

下一代前端开发语言 TypeScript从零重构axios

课程从零开始重构功能完整的JS库,是学习造轮子的不二之选!

2631 学习 · 877 问题

查看课程