2016-10-19 1 views
2

私はこのarticleからTDDを学びました。著者は、MochaのbeforeEachがあなたのためにどのようにコードを実行するのかについて話します。しかし、私はあなたが記述スコープでコードを実行するだけのときになぜそれを行う必要があるのか​​理解していません。#describeスコープ内でコードを実行できるのは、Mochaの#beforeEachの目的は何ですか?

describe('Test suite for UserComponent',() => { 
    beforeEach(() => { 
    // Prevent duplication 
    wrapper = shallow(<UserComponent 
          name={ 'Reign' } 
          age={ 26 } />); 
    }); 

    it('UserComponent should exist',() => { 
    expect(wrapper).to.exist; 
    }); 

    it('Correctly displays the user name and age in paragraphs wrapped under a parent div',() => { 
    expect(wrapper.type()).to.equal('div'); 
    // more code... 
    }); 
}); 

しかしbeforeEachはまだ動作します使用していない -

describe('Test suite for UserComponent',() => { 

wrapper = shallow(<UserComponent 
         name={ 'Reign' } 
         age={ 26 } />); 

    it('UserComponent should exist',() => { 
    expect(wrapper).to.exist; 
    }); 

    it('Correctly displays the user name and age in paragraphs wrapped under a parent div',() => { 
    expect(wrapper.type()).to.equal('div'); 
    // more code... 
    }); 
}); 
+0

各テストの前にajaxリクエストを呼び出す場合は、またはDBリクエスト?または明確な変数? – Maxx

答えて

2

beforeEachテストの前に実行されます。コードがbeforeEachからdescribeに渡された関数のすぐ内側に移動すると、この繰り返しは失われます。しかし、それだけではありません。

において一部例、describeに渡される関数内で直接実行されるコードは、beforeEachフックと同じタスクを実行することができます。たとえば、その機能がdescribeブロック内のテストにローカルな読み取り専用構造体を初期化する場合は、beforeEachフックをスキップできます。

しかし、beforeEach呼び出しは将来の実行のためにそれに渡された関数を登録するのに対し、モカはすぐdescribe呼び出しに渡されるすべてのコールバックを実行し、それが必要な場合にのみを実行されます。初期設定が高価な場合は、--grepを使用していくつかのテストのみを選択するか、it.onlyを使用して1つのテストを実行すると、ホックが実行されるので、ホックはbeforeEachフックを使用する方がよいでしょう。実際に走った。 describeに初期化コードがある場合、Mochaはそれをスキップできないので、毎回の初期化コストを支払うことになります。ただし、フックを使用する場合、データが不変の場合、beforebeforeEachよりも優れています。これは、各テストの前にではなく、に一度はで実行されるためです。

次に、実行コードが直接describeに渡された場合、単に動作しないことがあります。sharedResourceは、すべてのテストで使用する必要のあるリソースであることを想像してください。例えば、状態を運ぶサードパーティのライブラリである可能性があります。一部のテストでは、特定の状態に設定する必要があります。他のテストでは、別の状態にする必要があります。これは動作しません:

"use strict"; 

const assert = require('assert'); 

let sharedResource; 

describe("in condition a",() => { 
    sharedResource = true; 

    it("sharedResource is true",() => assert(sharedResource)); 
}); 

describe("in condition b",() => { 
    sharedResource = false; 

    it("sharedResource is false",() => assert(!sharedResource)); 
}); 

をキーステートメントの実行順序があるので、最初のテストは失敗します。

  1. sharedResource = true;
  2. sharedResource = false;
  3. assert(sharedResource);
  4. assert(!sharedResource);

beforeEachを使用して問題を簡単に修正できます。これは正常に実行されます:

"use strict"; 

const assert = require('assert'); 

let sharedResource; 

describe("in condition a",() => { 
    beforeEach(() => { 
     sharedResource = true; 
    }); 

    it("sharedResource is true",() => assert(sharedResource)); 
}); 

describe("in condition b",() => { 
    beforeEach(() => { 
     sharedResource = false; 
    }); 

    it("sharedResource is false",() => assert(!sharedResource)); 
}); 
+0

私は最初のテストが失敗する理由を理解していますが、最初のテストのスコープにないときにsharedResourceをfalseに設定するのはなぜですか?それは後に来て、第2テストのスコープでのみfalseに設定されるので、第2テストにのみ適用すべきではありませんか? – stackjlei

+1

私が書いたように、 "Mochaはコールを記述するために渡されたすべてのコールバックをすぐに実行します"。私は 'beforeEach'が将来の実行のためにフックを登録するが、' it'の場合もそうであると明示的に言っていないことに言及しました。モカが「それを」実行すると、テストはすぐに実行され、すぐには実行されません。この[回答](http://stackoverflow.com/a/21470373/1906307)は実行命令の詳細に入ります。 – Louis

関連する問題