phpunit の高貴な開発者の皆さん、こんにちは。
https://github.com/sebastianbergmann/phpunit/pull/1377 で紹介されているPHPUnit_Framework_Assert::assertArraySubset()
について話します。
このような便利なアサーション機能を提供していただき、誠にありがとうございます。
それはとてもいいですが、1 つの非常に重要な点が欠けています。
そのようなコードを考えてみましょう:
$expected = [
'a' => 'item a',
'b' => 'item b',
'c' => [
'd' => 'item d',
],
];
$this->assertArraySubset($expected, [
'a' => 'item a',
'b' => 'item k', // wrong value
'c' => [
// 'd' not present
'g' => 'item g',
],
]);
現在の実装では、次のようなエラーが発生します。
1) RetrievalCommandManagerTest::checkServicesImportProcess with data set #0 ...
Failed asserting that an array has the subset Array &0 (
'a' => 'item a'
'b' => 'item b'
'c' => Array &1 (
'd' => 'item d'
)
).
ここで何が怪しいか分かりますか? サブセットが正しくないことはわかりますが、どこが正しくないかはわかりません。
適切なエラーは次のようになります。
1) RetrievalCommandManagerTest::checkServicesImportProcess with data set #0 ...
Failed asserting that an array has the subset.
--- Expected
+++ Actual
@@ @@
Array &0 (
'a' => 'item a'
--- 'b' => 'item b'
+++ 'b' => 'item k'
'c' => Array &1 (
--- 'd' => 'item d'
)
).
diff を使用して失敗メッセージを実装し、プル リクエストを行うことができます。 アイデアが気に入りましたか?
トップレベルのコードで関数 it を基本的にオーバーライドする方法:
public static function assertArraySubset(array $expectation, array $reality,
$strict = false, $message = '')
{
// parent::assertEquals($expectation, $reality, $strict, $message);
foreach ($expectation as $key => $value) {
self::assertArrayHasKey($key, $reality, $message);
if (is_array($value)) {
self::assertArraySubset($value, $reality[$key], $strict, $message.'['.$key.']');
} else {
self::assertEquals($value, $reality[$key], $message.'['.$key.']');
}
}
}
あなたのdiffには、存在するが期待されていない「g」キーも含まれている必要がありますか?
@jmauerhan 、返信ありがとう
私はそうすべきではないと信じています。
assertArraySubset()
の考え方を正しく理解していれば、「このサブセットで指定したキーがデータと一致していることを確認し、残りのキーを気にしないでください」ということです。
私たちのチーム (そして残りのユーザーもそうですが) のassertArraySubset()
使い方は、出力の最も重要な部分をチェックすることです。
したがって、サブセットで指定されていないキー (この場合は「g」)は絶対に diff に存在ません。
これは本当に便利な機能でしょう。 これについて何か進展はありますか?
最も参考になるコメント
@jmauerhan 、返信ありがとう
私はそうすべきではないと信じています。
assertArraySubset()
の考え方を正しく理解していれば、「このサブセットで指定したキーがデータと一致していることを確認し、残りのキーを気にしないでください」ということです。私たちのチーム (そして残りのユーザーもそうですが) の
assertArraySubset()
使い方は、出力の最も重要な部分をチェックすることです。したがって、サブセットで指定されていないキー (この場合は「g」)は絶対に diff に存在ません。