2015-09-05 3 views
2

Я хотел бы, чтобы проверить мое обещание обработчика решительности и обещает обработчик отбраковки с помощью mocha, chai и sinon .Кром того, я получил sinon-chai плагина и sinon-stub-promise плагина настроить.тестирования обещает с мокко Chai и Синоном

Это мой блок требуют заявлений:

var chai = require('chai'); 
var expect = chai.expect; 
var sinonChai = require('sinon-chai'); 
chai.use(sinonChai); 
var sinon = require('sinon'); 
var sinonStubPromise = require('sinon-stub-promise'); 
sinonStubPromise(sinon); 

Это мой тестовый набор:

describe('Connect to github users',function(done){ 

    var api = require('../users'), 
     onSuccess = api.onSuccess, 
     onError = api.onReject; 
    console.dir(api); 
    //the idea is not to test the async connection,the idea is to test 
    //async connection but to test how the results are handled. 
    var resolveHandler, 
     rejectHandler, 
     getPromise, 
     result; 

    beforeEach(function(){ 
     resolveHandler = sinon.spy(onSuccess); 
     rejectHandler = sinon.spy(onError); 
     getPromise = sinon.stub().returnsPromise(); 
    }); 

    it('must obtain the result when promise is successful',function(){ 
     result = [...];//is an actual JSON array  
     getPromise.resolves(result); 

     getPromise() 
      .then(resolveHandler) 
      .catch(rejectHandler); 

     expect(resolveHandler).to.have.been.called();//error 
     expect(resolveHandler).to.have.returned(result); 
     expect(rejectHandler).to.have.not.been.called();  
     done(); 
    }); 

    afterEach(function(){ 
     resolveHandler.reset(); 
     rejectHandler.reset(); 
     getPromise.restore(); 
    }); 

}); 

я оказываюсь получаю эту ошибку:

Connect to github users must obtain the result when promise is successful: 
TypeError: expect(...).to.have.been.called.toEqual is not a function 
    at Context.<anonymous> (C:\Users\vamsi\Do\testing_promises\test\githubUsersSpec.js:94:46) 
+0

Являются ли пропущенные обещания синхронными? – Bergi

+0

Реализация является «thenable», которая может быть привязана ко всему, что имеет «то», включая «реальное обещание», которое я бы не хотел делать, поэтому я использую 'resolves' и' rejects' для проверки только обработчика. Я попробовал это после просмотра [этого видео] (https://youtu.be/HHcEjAQ46Io?t=2213), где он фиксирует аргументы для обратного вызова jQuery ajax, – vamsiampolu

+0

Да, я просто подумал, что вы ожидаете, что обработчики будут вызваны правильно после того, как вы их приложили. Обычные обещания потерпят неудачу. – Bergi

ответ

-1

Эта строка кода здесь неверно:

expect(resolveHandler).to.have.been.called(); 

called это просто свойство на spy, значение которого всегда boolean и может быть просто проверена с помощью chai так:

expect(resolveHandler.called).to.equal(true); 

Точно так же вместо этой строки, чтобы подтвердить, что эта функция не отвергается:

expect(rejectHandler).to.have.not.been.called(); 

Используйте это с called как свойство:

expect(rejectHandler.called).to.equal(false); 
+1

Код не является неправильным, он пытается использовать 'sinon-chai', и поэтому' to.have.been.called' является допустимым кодом. –

0

Пакет sinon-with-promise должен соответствовать счету за то, что вы пытаетесь сделать. Я столкнулся с той же проблемой (за исключением того, что мне не нужно было проверять случаи отказа), и это получилось красиво.

Смежные вопросы