supertestのREADMEを読むと、リクエスト実行の最後にend()
関数でエラーを処理したり、expect
の第二引数にdone
を渡してやるみたいなことが書かれていて、あまり深く考えずにそのまま書いていたのですが、done
を使わずにPromise
を返すように書きたいので何とかできないか色々やってみました。
test/test.js
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 support って書いてあったので普通にいけそうです。
こんな感じになりました。
test/test.js
describe('GET /users', () => {
it('respond with json', () =>
request(app)
.get('/users')
.expect(200)
.then(res => {
assert.ok()
})
)
})
supertestが返すTestオブジェクト
supertestで使う.get()
とか.expect()
みたいな関数は、supertestで実装されているTest
というクラスのインスタンスを返します。
これ自体はPromise
ではないのですが、then
とcatch
を実装していてPromise
を返してくれます。さらにこのPromise
が、内部でend()
を実行してくれて、エラーが発生したときにはreject(err)
してくれるので、こっちを使ったほうがスッキリ書けていい感じです。
独自の例外処理
あまり思いつかないですが、どうしても独自の例外処理を書く必要が出てきた場合は、catch
に書けば実行されます。
ただし、エラーを投げないと、例外発生時にもテストが正常終了してしまうので注意です。
test/test.js
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