[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