Phpunit: assertArraySubset() は、アサーションが失敗したときに diff を提供する必要があります。

作成日 2016年07月07日  ·  4コメント  ·  ソース: sebastianbergmann/phpunit

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 を使用して失敗メッセージを実装し、プル リクエストを行うことができます。 アイデアが気に入りましたか?

typbug

最も参考になるコメント

@jmauerhan 、返信ありがとう

私はそうすべきではないと信じています。
assertArraySubset()の考え方を正しく理解していれば、「このサブセットで指定したキーがデータと一致していることを確認し、残りのキーを気にしないでください」ということです。

私たちのチーム (そして残りのユーザーもそうですが) のassertArraySubset()使い方は、出力の最も重要な部分をチェックすることです。

したがって、サブセットで指定されていないキー (この場合は「g」)は絶対に diff に存在ません

全てのコメント4件

トップレベルのコードで関数 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 に存在ません

これは本当に便利な機能でしょう。 これについて何か進展はありますか?

このページは役に立ちましたか?
0 / 5 - 0 評価