2016-11-30 2 views
3

저는 다음과 같은 간단한 함수를 가지고 있습니다.Sinon이 단위 테스트 'catch'문을 사용합니다.

module.exports = { 
    fetchUser:function(myUserId) { 
    return new Promise((resolve, reject) => { 
     this.getUser(myUserId) 
     .then(user => { 
      // do logic // then return user 

      return user; 
     }) 
     .then(resolve) 
     .catch(err => { 
      // whoops there has been an error 

      let error = { error: 'My Error' }; 

      reject(error); 
     }); 
    }); 
    } 
}; 

내가 단위 테스트 모두 resolvereject 결과를 원한다.

간단한 chai 테스트는 다음과 같습니다.

var expect = require('chai').expect; 
var user = require('./user'); 

describe('User module', function() { 
    it('test fetchUser', function() { 
    let _user = user.fetchUser('abc123'); 

    return _user 
     .then(user => { 
     expect(data).to.be.an('object'); 
     }); 
    }); 

reject 오류가 발생하는 fetchUser 기능을 위해, sinon 또는 다른 라이브러리를 어떻게 사용하십니까?

답변

3

.

const User = require("./fetchUserModule"); 

describe('User module',() => { 
    beforeEach(() => User.getUser = sinon.stub()); 

    afterEach(() => User.getUser.reset()); 

    it('returns user if `getUser` returns data',() => { 
     const user = {name: 'John'}; 
     User.getUser.withArgs("abc123").returns(Promise.resolve(user)); 

     return User.fetchUser("abc123").then(result => { 
      expect(result).to.equal(user) 
     }).catch(error => { 
      expect(error).to.be.undefined; 
     }) 
    }); 

    it('throws error if `getUser` is rejected',() => { 
     User.getUser.withArgs("abc123").returns(Promise.reject()); 

     return User.fetchUser("abc123").then(result => { 
      expect(result).to.be.undefined; 
     }).catch(err => { 
      expect(err).to.eql({error: 'My Error'}) 
     }) 
    }); 
}); 
+0

감사합니다. 이 방법으로 테스트를 설정하면 실제로 내 catch 코드 블록을 입력하지 않습니다. 스텁은 내 catch에서 던져진 오류와 일치하는 응답을 그냥 가짜 만듭니다. – sketchthat

+2

예, 오류가'{error : 'My Error'}'와 같으므로 catch 문에 입력됩니다. 그것이 효과가 있다는 것을 증명하기 위해 더 필요한 것이 있습니까? –

+0

고마워, 나는 단지 검사하고 있었다, 나는 스텁을 아직 완전히 이해하지 못한다. 나는 그것을 시험 할 것이다. – sketchthat

1

오류가 발생할 수있는 "논리"로 시작하십시오.

그렇지 않은 경우 데이터를 반환하는 대신 오류를 표시하거나 거부하려면 this.getUser을 스터핑해야합니다. sinon-as-promised 패치 sinon.stub에는 .resolves.rejects 약속 도우미가 포함됩니다.

const sinon = require('sinon') 
require('sinon-as-promised') 

오류 테스트를 위해 스텁을 설정하십시오.

before(function(){ 
    sinon.stub(user, 'getUser').rejects(new Error('whatever')) 
}) 

after(function(){ 
    user.getUser.restore() 
}) 

그런 다음 .fetchUser 오류를 잡을 또는 설탕에 대한 chai-as-promised을 사용 중. 당신이 보조 노트로 새로운 세계

it('test fetchUser', async function() { 
    try { 
    await user.fetchUser('abc123') 
    expect.fail('fetchUser should be rejected')) 
    } catch(err) { 
    expect(err.message).to.eql('whatever') 
    } 
}) 

it('test fetchUser', function() { 
    return user.fetchUser('abc123') 
    .then(()=> expect.fail('fetchUser should be rejected')) 
    .catch(err => { 
     expect(err.message).to.eql('whatever') 
    }) 
}) 

it('test fetchUser', function() { 
    return expect(user.fetchUser('abc123')).to.be.rejectedWith(Error) 
}) 

또는 async 사는 경우에, 당신은 이미 new Promise에 약속을 반환 뭔가 포장 및 오류 정보 손실에주의 할 필요가 없습니다 여러 .catch 핸들러를 연결할 때 모카 그것이 스텁 getUser 방법으로 구현 될 수있다 및 Sinon차이와

fetchUser: function (myUserId) { 
    return this.getUser(myUserId) 
    .then(user => { 
     //logic 
     return user 
    }) 
    .catch(err => { 
     let error = new Error('My Error') 
     error.original = err 
     reject(error) 
    }); 
} 
+0

감사합니다. Matt. 마지막 포인트를 모르겠다. 나는 코드베이스를 업데이트 할 것이다. – sketchthat