複数のスペック全体で使用するカスタムマッチングコードをプロジェクトがカプセル化したい場合が頻繁にあります。ここでは、Jasmine互換のカスタムマッチャーを作成する方法を示します。
本質的にカスタムマッチャーは、actual 値とexpected 値を受け取る比較関数です。このファクトリは、理想的にはbeforeEach への呼び出しでJasmineに渡され、指定のdescribe 呼び出し内のすべてのスペックで有効期限が切れるまでスコープ内になり利用可能になります。カスタムマッチャーは、スペック間で削除されます。ファクトリの名前は、expect への呼び出しの戻り値に公開されたマッチャーの名前になります。
|
|
このオブジェクトは、「toBeGoofy」というカスタムマッチャーがあります。
|
|
マッチャーファクトリ
カスタムマッチャーファクトリは、2つのオブジェクトが等しいかどうかを判定するなどのタスクを実行するためにマッチャーが使用できる一連のユーティリティ関数があるmatchersUtil パラメーターが渡されます(参照ドキュメントについては、MatchersUtil を参照してください)。適切な場所でMatchersUtil を使用すると、カスタムマッチャーはカスタム等価性テスターおよびカスタムオブジェクトフォーマッターと余分な作業なしで動作できます。
Jasmine 3.5以前との互換性のために、2番目のcustomEqualityTesters パラメーターが渡されます。Jasmine 3.6以降に記述されたマッチャーはそれを無視してください。これはJasmine 4では提供されなくなります。
|
toBeGoofy: function(matchersUtil) {
|
ファクトリメソッドは、期待値をチェックするために呼び出されるcompare 関数があるオブジェクトを返す必要があります。
|
|
compare と比較する関数
compare関数は、最初の引数としてexpect() に渡される値(実際)と、2番目の引数としてマッチャー自体に渡される値(存在する場合)を受け取ります。
|
compare: function(actual, expected) {
|
toBeGoofy はオプションのexpected 引数を受け取るので、渡されない場合はここで定義します。
|
if (expected === undefined) {
expected = '';
}
|
結果
compare 関数は、マッチャーのブーリアン結果であるpass プロパティがある結果オブジェクトを返す必要があります。pass プロパティは、expectationにマッチャーが成功(true )したか失敗したか(false )を伝えます。expectationが.not で呼ばれたり、ネストされたりすると、expectationはこの値を否定してexpectationが満たされているかどうかを判定します。
|
|
toBeGoofy は実際のhyuk プロパティがexpectationに一致するかどうかを確認するためにテストします。
|
result.pass = matchersUtil.equals(actual.hyuk,
"gawrsh" + expected);
|
エラーメッセージ
undefined をそのままにすると、期待値はマッチャーの失敗メッセージを作成しようとします。しかし、返り値にmessage プロパティがある場合、失敗した期待値に使用されます。
|
|
マッチャーが成功した場合、負の期待値の場合(expectationが.not で使用される場合)にはカスタムの失敗メッセージが表示されるはずです。
|
result.message = "Expected " + actual +
" not to be quite so goofy";
} else {
|
マッチャーが失敗した場合、正の期待値の場合にはカスタムの失敗メッセージが表示されるはずです。
|
result.message = "Expected " + actual +
" to be goofy, but it was not very goofy";
}
|
比較の結果を返します。
|
|
カスタムの否定比較
上記の単純なブーリアン反転より否定の比較(not の場合)をより細かく管理する必要がある場合、マッチャーファクトリにcompare の他に別のキーnegativeCompare (.not が使用された場合に呼び出す関数の値)を含めることもできます。この関数/キーはオプションです。
|
|
登録と使用
|
describe("Custom matcher: 'toBeGoofy'", function() {
|
Jasmineにカスタムマッチャーを登録します。渡されたオブジェクトのすべてのプロパティは、カスタムマッチャーとして利用できます(この場合はtoBeGoofy など)。
|
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
|
Jasmineにカスタムマッチャーが登録されると、どの期待値でも利用できます。
|
it("is available on an expectation", function() {
expect({
hyuk: 'gawrsh'
}).toBeGoofy();
});
it("can take an 'expected' parameter", function() {
expect({
hyuk: 'gawrsh is fun'
}).toBeGoofy(' is fun');
});
it("can be negated", function() {
expect({
hyuk: 'this is fun'
}).not.toBeGoofy();
});
});
|