web-dev-qa-db-ja.com

BeforeAll対BeforeEach。いつ使うの?

最近、同僚のコードを調べていたところ、彼が記述呼び出しの上部にあるBeforeAll関数にjest関数を実装し、beforeEach関数にデータオブジェクトを作成していることに気付きました。これは、BeforeAllとBeforeEachの違いは何なのかと疑問に思いました。

そろそろ... Googleに行ってきました!! 2つの機能の違いのいくつかに光を当てるのに役立つ記事を見つけました。

調査結果1http://breazeal.com/blog/jasmineBefore.html

調査結果2@ Before、@ BeforeClass、@ BeforeEachと@BeforeAllの違い

記事を考えると、BeforeAllが1回だけ呼び出されることがわかりました。 BeforeEachは、個々のテストの前に呼び出されます。素晴らしかった!いつ呼び出されたのかよくわかりました!

また、BeforeAllがコードの初期化に最適であることがわかりました。それは完全に理にかなっています!一度初期化してください。ブーム、あなたは終わりました。

私が混乱しているのは、何かが初期化されるときと初期化されないときです。私たちのコードでは、BeforeEachが頻繁に使用されていることがわかりました。私が興味を持っているのは、どのようなコードが「初期化」コードであると見なされているのか、それに対して、BeforeEachにあるべきコードは何ですか。

以下のコードの例:

    beforeAll((done) => {
      // Mocking method from within Box file
      transferBoxPlanSpy = jest.spyOn(Box, 'transferPlanFromBox').mockImplementation(() => Promise.resolve());

      // Pulling data from MongoDB
      User.findOne({ user_name: 'testsurgeon1' }, (err, user) => {
        user.addMGSPermission();
        user.save(done);
      });
    });

    beforeEach(() => {
      planData2 = {
        user_name: 'hello1',
        laterality: 'right',
        plan_id: 'testplan42',
        order_number: '856-hd-02-l',
        file_id: '123456sbyuidbefui',
      };
    });

私の質問が漠然としていないことを願っています。お時間をいただきありがとうございます!

編集1このコードは私自身ではなく、ソフトウェアチームのメンバーの1人が作成したものであることを指摘しておきます。彼はオブジェクトをBeforeEachの内部に置き、モックをBeforeAllの内部に置きます。

私の混乱は、いくつかの例外を除いて、すべてのコードをBeforeAllに入れることができるようです。

4
TechnicalViking

どちらも、1つ以上のテストに必要な条件をセットアップするために使用されます。

テストでこれらの条件が変更されないことが確実な場合は、beforeAll(1度だけ実行されます)を使用できます。

テストdoがこれらの条件に変更を加える場合、すべてのテストの前に実行されるbeforeEachを使用する必要があります。これにより、次のテストの条件をリセットできます。

初期化が遅いか、計算量が多い場合を除き、人為的エラーの機会を減らすため、デフォルトでbeforeEachを使用するのが最も安全です。つまり、1つのテストが次のテストの設定を変更していることに気付かない場合があります。

あなたが示したサンプルは、両方を組み合わせて使用​​する良い例です-遅いネットワーク呼び出しはbeforeAllに入れられるため、一度だけ実行する必要があります。そして、データ・オブジェクト(おそらくテストによって変更される)は、beforeEachで毎回リセットされます。

6
Daniel Beck