ホームページ > ウェブフロントエンド > jsチュートリアル > 冗談の要約: いつ何が実行されるのか?

冗談の要約: いつ何が実行されるのか?

王林
リリース: 2024-07-19 15:59:30
オリジナル
1111 人が閲覧しました

Jest Recap: What Runs When?

TL;DR: 執行命令

  1. トップレベルおよびdescribe()ブロック内のすべてのもの(describe()ブロックは基本的にIIFEです)
  2. beforeAll()
    1. トップレベル
    2. 第1レベルのdescribe()
    3. N レベルの description()
  3. beforeEach()
    1. トップレベル
    2. 第1レベルのdescribe()
    3. N レベルの description()
  4. テスト()
  5. afterEach()
    1. N レベルの description()
    2. 第1レベルのdescribe()
    3. トップレベル
  6. 結局()
    1. N レベルの description()
    2. 第1レベルのdescribe()
    3. トップレベル

免責事項

あなたは冗談と単体テストの基本を理解していると思います。フックの意味については説明しません。これはチートシート/参照タイプの投稿です。

ルールがあります

最初は、冗談は魔法のように物事を行うように見えます。何がいつ実行されるのか?しかし、少し考えてみれば、それは明らかであり、混乱は少なくなります。

これらの単純な「ルール」が役立つかもしれません:

  1. 各ファイルは独立して実行されます。A.test.js で何をしても B.test.js には影響しません。 (外部リソースへのアクセスを開始しない限り)
  2. description() コールバックはすぐに実行されます。
  3. フック (beforeAll/afterAll、beforeEach/afterEach) は、外側のスコープ (トップレベル/モジュール) から内側のスコープ (describe) まで実行されます。

基本的な例

console.log("./<start>");

beforeAll(() => {
    console.log("./beforeAll");
})
beforeEach(() => {
    console.log("./beforeEach");
})
afterAll(() => {
    console.log("./afterAll");
})
afterEach(() => {
    console.log("./afterEach");
})

describe("foo", () => {
    console.log("./describe(foo)/<start>");

    beforeAll(() => {
        console.log("./describe(foo)/beforeAll");
    })
    beforeEach(() => {
        console.log("./describe(foo)/beforeEach");
    })
    afterAll(() => {
        console.log("./describe(foo)/afterAll");
    })
    afterEach(() => {
        console.log("./describe(foo)/afterEach");
    })

    test("testFoo", () => {
        console.log("./describe(foo)/test(testFoo)");
    })

    console.log("./describe(foo)/<end>");
})

describe("bar", () => {
    console.log("./describe(bar)/<start>");

    beforeAll(() => {
        console.log("./describe(bar)/beforeAll");
    })
    beforeEach(() => {
        console.log("./describe(bar)/beforeEach");
    })
    afterAll(() => {
        console.log("./describe(bar)/afterAll");
    })
    afterEach(() => {
        console.log("./describe(bar)/afterEach");
    })

    test("testBar", () => {
        console.log("./describe(bar)/test(testBar)");
    })
    test("testOtherBar", () => {
        console.log("./describe(bar)/test(testOtherBar)");
    })

    console.log("./describe(bar)/<end>");
})

console.log("./<end>");
ログイン後にコピー

これは結果です (他の出力を削除した後):

./<start>
./describe(foo)/<start>
./describe(foo)/<end>
./describe(bar)/<start>
./describe(bar)/<end>
./<end>

./beforeAll

./describe(foo)/beforeAll
./beforeEach
./describe(foo)/beforeEach
./describe(foo)/test(testFoo)
./describe(foo)/afterEach
./afterEach
./describe(foo)/afterAll

./describe(bar)/beforeAll
./beforeEach
./describe(bar)/beforeEach
./describe(bar)/test(testBar)
./describe(bar)/afterEach
./afterEach

./beforeEach
./describe(bar)/beforeEach
./describe(bar)/test(testOtherBar)
./describe(bar)/afterEach
./afterEach
./describe(bar)/afterAll

./afterAll
ログイン後にコピー

何が起こるのですか?

トップレベルと記述コールバック内のすべてがすぐに実行されます:

./<start>
./describe(foo)/<start>
./describe(foo)/<end>
./describe(bar)/<start>
./describe(bar)/<end>
./<end>
[...]
ログイン後にコピー
最上位の

beforeAll と afterAll は、すべてのテストを囲む「中括弧」です。それぞれは 1 回だけ実行されます。

[...]

./beforeAll

[...]

./afterAll
ログイン後にコピー

./describe(*)/beforeAll および ./describe(*)/afterAll は、コールバックを記述する that 内のすべてのテストを囲む中括弧です。それぞれは 1 回だけ実行されます。

[...]

./describe(foo)/beforeAll
[...]
./describe(foo)/afterAll

./describe(bar)/beforeAll
[...]
./describe(bar)/afterAll

[...]
ログイン後にコピー

beforeEach と afterEach は、各テストを囲む中括弧です。最上位は外側中括弧です。記述レベルは 内側 中括弧です。

[...]
./beforeEach
./describe(*)/beforeEach
[...]
./describe(*)/afterEach
./afterEach
[...]
ログイン後にコピー

アドバンストバージョン

これは、ネストされた記述ブロックを使用した高度な例です。実行ステップの階層的な性質を強調するために、XML 風の結果が生成されます。

console.log("<top-level>");

beforeAll(() => {
    console.log("<all>");
})
beforeEach(() => {
    console.log("<each>");
})
afterAll(() => {
    console.log("</all>");
})
afterEach(() => {
    console.log("</each>");
})

describe("foo", () => {
    console.log("<describe id=\"foo\">");

    beforeAll(() => {
        console.log("<all in=\"foo\">");
    })
    beforeEach(() => {
        console.log("<each in=\"foo\">");
    })
    afterAll(() => {
        console.log("</all>  <!-- in=\"foo\" -->");
    })
    afterEach(() => {
        console.log("</each>  <!-- in=\"foo\" -->");
    })

    test("testFoo", () => {
        console.log("<test in=\"foo\" id=\"testFoo\" />");
    })

    console.log("</describe> <!-- id=\"foo\" -->");
})

describe("bar", () => {
    describe("barinner", () => {
        console.log("<describe id=\"barinner\">");

        beforeAll(() => {
            console.log("<all in=\"barinner\">");
        })
        beforeEach(() => {
            console.log("<each in=\"barinner\">");
        })
        afterAll(() => {
            console.log("</all> <!-- in=\"barinner\" -->");
        })
        afterEach(() => {
            console.log("</each> <!-- in=\"barinner\" -->");
        })

        test("testBarInner", () => {
            console.log("<test in=\"barinner\" id=\"testBarInner\" />");
        })

        console.log("</describe> <!-- id=\"barinner\" -->");
    })

    console.log("<describe id=\"bar\">");

    beforeAll(() => {
        console.log("<all in=\"bar\">");
    })
    beforeEach(() => {
        console.log("<each in=\"bar\">");
    })
    afterAll(() => {
        console.log("</all> <!-- in=\"bar\" -->");
    })
    afterEach(() => {
        console.log("</each> <!-- in=\"bar\" -->");
    })

    test("testBar", () => {
        console.log("<test in=\"bar\" id=\"testBar\" />");
    })
    test("testOtherBar", () => {
        console.log("<test in=\"bar\" id=\"testOtherBar\" />");
    })

    console.log("</describe> <!-- id=\"bar\" -->");
})

console.log("</top-level>");
ログイン後にコピー

これはクリーンアップとフォーマット後の出力です:

<top-level>
    <describe id="foo">
    </describe> <!-- id="foo" -->

    <describe id="barinner">
    </describe> <!-- id="barinner" -->

    <describe id="bar">
    </describe> <!-- id="bar" -->
</top-level>

<all>
    <all in="foo">
        <each>
            <each in="foo">
                <test in="foo" id="testFoo" />
            </each>  <!-- in="foo" -->
        </each>
    </all>  <!-- in="foo" -->
    <all in="bar">
        <all in="barinner">
            <each>
                <each in="bar">
                    <each in="barinner">
                        <test in="barinner" id="testBarInner" />
                    </each> <!-- in="barinner" -->
                </each> <!-- in="bar" -->
            </each>
        </all> <!-- in="barinner" -->
        <each>
            <each in="bar">
                <test in="bar" id="testBar" />
            </each> <!-- in="bar" -->
        </each>
        <each>
            <each in="bar">
                <test in="bar" id="otherBar" />
            </each> <!-- in="bar" -->
        </each>
    </all> <!-- in="bar" -->
</all>
ログイン後にコピー

実行命令について知っておくべきことは以上です。

以上が冗談の要約: いつ何が実行されるのか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート