[nodejs] 不必使用supertest的end函数

当我阅读 supertest 的 README 文件时,发现在执行请求的最后使用 end() 函数处理错误,或将 done 参数传递给 expect 的第二个参数。我一直按原样写下去,没有深入考虑。但我想要将其改为返回 Promise 而不是使用 done,所以尝试了各种方法来实现。

describe('GET /users', () => {
  it('respond with json', done => {
    request(app)
      .get('/users')
      .expect(200)
      .end(function(err, res) {    // この辺がうっとうしい
        if (err) return done(err)  // この辺がうっとうしい
        assert.ok()
        done()                     // この辺がうっとうしい
      })
  })
})

我稍微滚动了一下README,发现写着Promise支持,所以应该正常使用。就是这样。

describe('GET /users', () => {
  it('respond with json', () => 
    request(app)
      .get('/users')
      .expect(200)
      .then(res => {
        assert.ok()
      })
  )
})

超级测试返回的Test对象

supertest的get()和expect()函数等,返回的是supertest实现的Test类的实例。它本身不是一个Promise,但会实现then和catch,并返回一个Promise。此外,这个Promise会在内部执行end(),并在发生错误时拒绝(reject)错误(err),因此使用它会更简洁、更方便。

单独的异常处理

尽管不常发生,但在必要的情况下,若需要编写独特的异常处理,可以将其写在catch中以执行。然而,如果没有抛出错误,测试在出现异常时也会正常结束,所以请注意。

describe('GET /users', () => {
  it('respond with json', () => 
    request(app)
      .get('/users')
      .expect(200)
      .then(res => {
        assert.ok()
      }).catch(err => {
        console.error(err)
        throw err
      })
  )
})
    • node 9.4.0

 

    • supertest 3.0.0

 

    superagent 3.8.2
bannerAds