test実行中にUnhandledPromiseRejectionWarningがどうしても解消できず苦戦した。
解消方法を残しておく。
環境
- debian 9.11
- node 12.10.0
- vue 3.12.0
- sinon 7.5.0
エラー発生場所
該当箇所のみ抜き出す。
describe('失敗', () => {
beforeEach(() => {
loginView = mount(KbnLoginView, {
stubs: { 'kbn-login-form': LoginFormComponentsStub },
store,
localVue
})
sinon.spy(loginView.vm, 'throwReject')
})
afterEach(() => {
loginView.vm.throwReject.restore()
})
it('エラー処理が呼び出されること', done => {
const message = 'login failed'
actions.login.rejects(new Error(message)) # このrejectsのエラーがcatchできず困っていた
triggerLogin(loginView, LoginFormComponentsStub)
loginView.vm.$nextTick(() => {
const callInfo = loginView.vm.throwReject
expect(callInfo.called).to.equal(true)
expect(callInfo.args[0][0].message).to.equal(message)
done()
})
})
})
一箇所だけコメントを入れているが、そこのエラーがハンドリングできず、UnhandledPromiseRejectionWarningが発生していた。
エラーはthrowRejectメソッドで投げられ、throwRejectはコメントの次の行のtriggerLogin内で呼ばれるのだが、
triggerLoginをtry-catchで囲んでもうまくいかず、どうすればハンドリングできるのかかなり悩んだ。
解決できた方法
it('エラー処理が呼び出されること', done => {
const message = 'login failed'
actions.login.rejects(new Error(message))
triggerLogin(loginView, LoginFormComponentsStub)
loginView.vm.$nextTick(() => {
loginView.vm.$nextTick().then(() => { # nextTickが追加されるのは別件のためここでは割愛
const callInfo = loginView.vm.throwReject
expect(callInfo.called).to.equal(true)
expect(callInfo.args[0][0].message).to.equal(message)
callInfo.returnValues[0].catch(err => { # sinon.spyから戻り値を取得し、catchする
expect(err.message).to.equal(message)
}).then(done)
})
})
})
タイトルにもある通り、sinon.spyを使用して解決した。
元々、throwRejectはsinon.spyを使用してラップされていたため、
戻り値を取得することができ、catchすることができた。
終わりに
初めて使ったが、できることが色々あって、これなら色んなパターンのテストにも対応できそう。
ただ、テストだから仕方ないとはいえ、本当にこの解決方法が正解なのかはよくわからない。
もっと正しい方法がある気もする。
ご存知の方いたら教えてくださいm(__)m
しかしこの本、初版の発行が2018/10/6の割には、色々バージョンが古すぎる気がする。
入門書なのだから、できるだけ最新バージョンで書くべきだと思うのだが・・・
javascriptの進化が早すぎて、難しいのだろうか・・・
Vue.js入門 基礎から実践アプリケーション開発まで
0 件のコメント:
コメントを投稿