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
テスト スイートを生成します。1
2
3
現在、テスト スイート名では、提供しているパラメータのみをフォーマットできます。この場合、配列の各オブジェクトのデータを各テスト スイートに渡していますaccounts
。したがって、テスト スイート名にフォーマット指定子を設定すると、それらはアカウント オブジェクト全体に適用されます (つまり、%s
例では、オブジェクトが文字列化され、 になります[object Object]
)。残念ながら、オブジェクトのキーにフォーマット指定子を適用することはできないと思います。
望みを実現するためのアイデア:
解決策1
フォーマッタを使用して%s
テスト スイート名を作成すると、toString
Object のメソッドが呼び出されます (デフォルトでは を返します[object Object]
)。
toString
各アカウント オブジェクトにメソッドを定義すると、代わりにそのメソッドが使用されます。したがって、次のコードを使用して、各アカウント オブジェクトにメソッドを追加できます (追加するメソッドはキーの値を返すことtoString
に注意してください)。toString
type
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
最初のパラメータがアカウント タイプになるように、テスト スイート データのそれぞれをいつでも再定義できます (現在はaccounts
2D 配列であることに注意してください)。
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]}
)。