2016-07-15 2 views
0

저는 단위 테스트를 처음 접했고 javascript로이 연습에 대한 자습서를 읽었습니다. 내 문제를 설명하기 위해 어리석은 예를 사용할 것이다.mocha chai 및 sinon과 독립적으로 javascript 기능을 테스트하는 방법은 무엇입니까?

존이 학교에 가야하고 그가 준비가되었는지 알기 전에 자신의 가방과 헤드폰이 있는지 확인해야한다고 가정 해 봅시다. 이것은 다음과 같은 함수를 호출 할 것이다 :

다음
john.isReadyToGo; 

문자 객체의 isReadtToGo() 함수의 구현이 될 때 :

이제
characher.isReadyToGo = function() { 
    return this.hasBag() && this.hasHeadPhones(); 
} 

characher.hasBag = function() { 
    // return true or false 
} 

characher.hasHeadPhones = function() { 
    //return true or false 
} 

,의 내가이 기능을 테스트 할 가정 해 봅시다. 단위 테스트에서는 다른 함수의 영향을받지 않고 함수를 테스트하는 것이 좋습니다. 즉,이 경우에는 세 함수를 테스트해야하지만 character.isReadyToGo() 함수는 this.hasBag() 및 this.hasHeadPhones()에 대한 모의 값을 가져야합니다. 내가 맞습니까?

그렇다면이 두 값을 조롱 할 수있는 방법에 대한 힌트를 제공해 줄 수 있습니까? 이것은 character.hasBagcharacter.hadHeadphones (이것은 beforeEach에서 행해진 다) 스텁 각 시험

let character = {}; 

character.isReadyToGo = function() { 
    return this.hasBag() && this.hasHeadPhones(); 
} 

character.hasBag = function() { 
    // return true or false 
} 

character.hasHeadPhones = function() { 
    //return true or false 
} 

const sinon = require('sinon'); 
const expect = require('chai').expect; 

describe('Is character ready?',() => { 

    beforeEach(() => { 
    sinon.stub(character, 'hasBag'); 
    sinon.stub(character, 'hasHeadPhones'); 
    }); 

    afterEach(() => { 
    character.hasBag.restore(); 
    character.hasHeadPhones.restore(); 
    }); 

    it("Not if they don't have a bag or headphones",() => { 
    character.hasBag.returns(false); 
    character.hasHeadPhones.returns(false); 
    expect(character.isReadyToGo()).to.be.false; 
    }); 

    it("Not if they have headphones but no bag",() => { 
    character.hasBag.returns(false); 
    character.hasHeadPhones.returns(true); 
    expect(character.isReadyToGo()).to.be.false; 
    }); 

    it("Not if they have a bag but no headphones",() => { 
    character.hasBag.returns(true); 
    character.hasHeadPhones.returns(false); 
    expect(character.isReadyToGo()).to.be.false; 
    }); 

    it("Yes, if they have a bag and headphones",() => { 
    character.hasBag.returns(true); 
    character.hasHeadPhones.returns(true); 
    expect(character.isReadyToGo()).to.be.true; 
    }); 

}); 

:

답변

1

여기 일례이다. 기본적으로 원본을 새 기능 (스텁)으로 바꿀 수 있습니다.

테스트에 따라 스텁이 각 기능 (.returns() 사용)에 대해 반환 할 내용을 "알려"isReadyToGo이 호출되고 그 결과가 예상과 비교하여 확인됩니다.

각 테스트 후에 스텁이 복원됩니다 (원래 함수가 복원됨을 의미).

+0

사소한 세부 사항 -'.to.be.true; '대신'.to.be.true();'가되어서는 안됩니다. –

+0

@JoeWhite [no] (http://chaijs.com/api/bdd/#true) = D – robertklep

관련 문제