jest .each name access object key 質問する

jest .each name access object key 質問する

nameの部分内のオブジェクトのキーにアクセスすることは可能ですか.each?

let accounts =
    [
        {
            details:
            {
                company_name:
                    "company_name",
                email,
                password:
                    "asdf",
            },
            find:
            [
                "_id",
                "company_name",
                "email",
                "type",
            ],
            type:
                "creator"
        },
        {
            details:
            {
                email,
                first_name:
                    "first_name",
                last_name:
                    "last_name",
                password:
                    "asdf",
            },
            find:
            [
                "_id",
                "email",
                "first_name",
                "last_name",
                "type",
            ],
            type:
                "user"
        },
    ]

describe.each(accounts)(
    "%s", // <-- access the 'type' key, e.g. account.type
    function (account)
    {
        // test code
    }
)

ベストアンサー1

冗談それぞれを記述する最初のパラメータには配列の配列が必要です。1D 配列を渡すと、内部的には配列の配列にマップされます (つまり、[1, 2, 3]最初のパラメータとして渡すと に変換されます[[1], [2], [3]])。

配列内の各配列は、テスト スイートのデータとして使用されます。したがって、前の例では、 は をデータとして含む最初のテスト スイート、をデータとして含む 2 番目のテスト スイート、 をデータとして含む 3 番目のテスト スイートの 3 つのdescribe.eachテスト スイートを生成します。123

現在、テスト スイート名では、提供しているパラメータのみをフォーマットできます。この場合、配列の各オブジェクトのデータを各テスト スイートに渡していますaccounts。したがって、テスト スイート名にフォーマット指定子を設定すると、それらはアカウント オブジェクト全体に適用されます (つまり、%s例では、オブジェクトが文字列化され、 になります[object Object])。残念ながら、オブジェクトのキーにフォーマット指定子を適用することはできないと思います。

望みを実現するためのアイデア:

解決策1

フォーマッタを使用して%sテスト スイート名を作成すると、toStringObject のメソッドが呼び出されます (デフォルトでは を返します[object Object])。

toString各アカウント オブジェクトにメソッドを定義すると、代わりにそのメソッドが使用されます。したがって、次のコードを使用して、各アカウント オブジェクトにメソッドを追加できます (追加するメソッドはキーの値を返すことtoStringに注意してください)。toStringtype

const accounts = [{
    details: {
        company_name: "company_name",
        email: "aa",
        password: "asdf",
    },
    find: [ "_id", "company_name", "email", "type", ],
    type: "creator"
}, {
    details: {
        email: 'bb',
        first_name: "first_name",
        last_name: "last_name",
        password: "asdf",
    },
    find: [ "_id", "email", "first_name", "last_name", "type", ],
    type: "user"
}].map(account => Object.assign(account, { toString: function() { return this.type; } }));

これで、%sフォーマット指定子を使用すると、各テスト スイートのアカウント タイプが表示されるようになります。

describe.each(accounts)(
    "%s", // <-- This will cause the toString method to be called.
    function (account)
    {
        // test code
    }
)

解決策2

最初のパラメータがアカウント タイプになるように、テスト スイート データのそれぞれをいつでも再定義できます (現在はaccounts2D 配列であることに注意してください)。

let accounts = [
    [
        "creator",
        {
            details: {
                company_name: "company_name",
                email: "email",
                password: "asdf",
            },
            find: [ "_id", "company_name", "email", "type", ],
            type: "creator"
        }
    ], [
        "user", 
        {
            details: {
                email: "email",
                first_name: "first_name",
                last_name: "last_name",
                password: "asdf",
            },
            find: [ "_id", "email", "first_name", "last_name", "type", ],
            type: "user"
        },
    ]
]

最初のパラメータ (アカウントの種類) を使用して、テスト スイートに名前を付けることができます。

describe.each(accounts)(
    '%s',  // <-- This %s will format the first item in each test suite array.
    function (accountType, account) {
        // test code
    }
); 

各テスト スイート配列には 2 つの要素があるため、テスト関数は 2 つのパラメーターを受け取ることに注意してください。最初のパラメーターはアカウント タイプで、2 番目のパラメーターはアカウント データです。

解決策3

タグ付きテンプレートリテラル形式を使用することができます。それぞれを記述するaccountsこのソリューションを使用すると、配列の現在の定義を変更する必要はありません。

describe.each`
    account
    ${accounts[0]}
    ${accounts[1]}
`('$account.type', function (account) { 
    // test code
});

このソリューションの欠点は、各テスト スイート データをテンプレート リテラルの新しい行に手動で追加する必要があることです (つまり、配列に新しい要素を追加する場合は、accountsそれをテンプレート リテラルの新しい行に として追加することを忘れないようにする必要があります${accounts[2]})。

おすすめ記事