Mochaは、デフォルトでnode.js(https://nodejs.org/api/assert.html )のAssertを使用しています。メソッドがエラーをスローするかどうかをチェックするために外部ライブラリは必要ありません。
Assertにはメソッドがあります- assert.throws
、3つのパラメーターがありますが、ここで実際に重要なのは2つだけです。
- 関数-ここでは関数呼び出しではなく関数を渡します
- エラー-ここでは、エラーをチェックするためのパスまたはオブジェクトのコンストラクターまたは関数
sendMessage(message)
メッセージパラメータが設定されていない場合にエラーをスローするという関数があると想像してみてください。機能コード:
function sendMessage(message) {
if (!message || typeof message !== 'string') {
throw new Error('Wrong message');
}
// rest of function
}
さて、それをテストするには、入力をカバーする追加の機能が必要です。なんで?assert.throws
テストされる関数にパラメーターを渡す機会がないためです。
だから代わりに
// WRONG
assert.throws(sendMessage, Error); // THIS IS WRONG! NO POSSIBILITY TO PASS ANYTHING
匿名関数を作成する必要があります:
// CORRECT
assert.throws(() => {
sendMessage(12); // usage of wanted function with test parameters
}, Error)
違いがわかりますか?関数を直接渡す代わりに、準備された入力で呼び出すことを目的として、匿名関数内に関数呼び出しを配置しました。
2番目のパラメーターはどうですか。スローするエラーの種類によって異なりますが、上記の例でError
はオブジェクトがスローされたため、そこに配置する必要がありましError
た。このアクションの結果として、assert.throws
スローされたオブジェクトが同じタイプのオブジェクトであるかどうかを比較します。別のものの代わりにError
スローされる場合は、この部分を変更する必要があります。たとえば、代わりにError
タイプの値をスローしますString
。
function sendMessage(message) {
if (!message || typeof message !== 'string') {
throw 'Wrong message'; // change to String
}
// rest of function
}
今度はテストコール
assert.throws(() => {
sendMessage(12); // usage of wanted function with test parameters
}, (err) => err === 'Wrong message')
2番目のパラメーターの代わりにError
、スローされたエラーを期待値と比較するために比較関数を使用しました。