`before ()`와`beforeEach ()`의 차이점은 무엇입니까?


90

특히 사이의 차이 무엇입니까 모카before()와는 beforeEach()? ( after()및에 대한 동일한 질문 afterEach().)

블록 before()당 한 번 실행 describe()되고 beforeEach()테스트 당 한 번 실행 된다고 가정 합니다 ( it()블록). 사실인가요?

그리고 언제 다른 것을 사용하기로 선택합니까?

답변:


188

before()전에 한 번 실행되는 모든 A의 테스트를 describe
after()   한 번 실행 한 후 모든 A의 테스트 describe
beforeEach()전에 실행되는 A의 테스트가 describe
afterEach()   실행 된 이후 A의 시험describe

사용하려는 것은 실제 테스트에 따라 다릅니다.

자, 긴 설명을 위해. mocha -R min이것을 실행 하면 :

describe("top", function () {
    before(function () {
        console.log("top before");
    });
    after(function () {
        console.log("top after");
    });
    beforeEach(function () {
        console.log("top beforeEach");
    });
    afterEach(function () {
        console.log("top afterEach");
    });
    it("test1", function () {
        console.log("top test1");
    });
    describe("sublevel", function() {
        before(function () {
            console.log("sublevel before");
        });
        after(function () {
            console.log("sublevel after");
        });
        beforeEach(function () {
            console.log("sublevel beforeEach");
        });
        afterEach(function () {
            console.log("sublevel afterEach");
        });
        it("test1", function () {
            console.log("sublevel test1");
        });
        it("test2", function () {
            console.log("sublevel test2");
        });
    });
    it("test2", function () {
        console.log("top test2");
    });
});

다음과 같은 내용이 표시됩니다 (관련없는 출력은 생략했습니다).

top before
top beforeEach
top test1
top afterEach
top beforeEach
top test2
top afterEach
sublevel before
top beforeEach
sublevel beforeEach
sublevel test1
sublevel afterEach
top afterEach
top beforeEach
sublevel beforeEach
sublevel test2
sublevel afterEach
top afterEach
sublevel after
top after

하위 수준의 각 테스트 전후에 실행되는 작업을 살펴보면 놀라운 것은 최상위 수준과 하위 수준 의 콜백 이 모두beforeEach 호출 된다는 것 입니다. 에 대한 똑같은 afterEach.

일부는 또한 순서에 놀라게된다 sublevel before, top beforeEach, sublevel beforeEach. : 그들은 외부 범위에있는 모든 고리들이 순서를 기대할 수 있도록, 내부 범위에있는 모든 후크하기 전에 실행해야한다고 생각 top beforeEach, sublevel before, sublevel beforeEach. 그러나 Mocha가 후크를 실행하는 순서는 완전히 의미가 있습니다. before후크는 테스트 그룹에 대한 단계를 설정하는 반면 beforeEach테스트는 각 개별 테스트에 대한 것입니다. Mocha가 테스트를 실행하면 에 설정된 모든 후크 before및 해당 beforeEach후크 describe가 포함 된 모든 조상 describe이 테스트에 적용됩니다. Mocha는 before가장 바깥 쪽 범위에서 가장 안쪽까지 각 후크를 실행 하고 가장 바깥 쪽 범위에서 가장 안쪽으로 모든 beforeEach후크를 실행합니다. 하나, before적용되는 모든 후크는 후크보다 먼저 실행됩니다 beforeEach. 이것은 위의 순서를 설명합니다 : 후크 이기 때문에 sublevel before이전에 실행 됩니다. 그리고으로 하고 , 같은 논리가 적용하지만 순서는 반대입니다 : 모든 적용 후크 어떤 전에 실행되는 훅.top beforeEachbeforeafterafterEachafterEachafter

또한 Mocha는 최상위 수준 itdescribe통화와 관련하여 통화 순서를 신경 쓰지 않습니다 describe. 그것은 실행 top test1, top test2그리고 다음 하위 수준 테스트, 내가 준 순서에도 불구하고 top test1다음, 다음 하위 수준의 테스트 및 top test2.

당신이 중에서 사용하고자하는 것은 before, beforeEach등 정말 시험의 특성에 따라 달라집니다. 모의 객체 또는 데이터 구조와이 객체 또는 구조를 설정해야하는 경우 단일에서 모든 테스트에서 재사용 할 수 있는 경우을 describe사용 before하여 설정하고 after해체 할 수 있습니다. 구조에 대해 읽기 전용 테스트를 수행하는 경우 일 수 있습니다. 모든 테스트에서 읽기만하면 반복해서 만들 필요가 없습니다. 각 테스트가 구조를 수정 하기 때문에 각 테스트에 구조 describe 사본이 필요한 경우 각 테스트에 대해 구조를 새로 작성하는 데 사용해야 합니다.beforeEachafterEach깨끗하게 뜯어 내야한다면 요 이렇게하면 테스트 격리가 보장됩니다. 각 테스트는 알려진 상태에서 시작되며 성공하기 위해 이전 테스트의 유무에 의존하지 않습니다.


1
감사합니다. 내 질문은 부분이 무엇이며 이유가 무엇인지, 특히 읽기 / 쓰기의 구별이 두 가지를 모두 해결했습니다.
ericsoco 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.