2016-01-23 2 views
0

Я застрял в тестах в Chai и Sinon. Как правило, я получил сервис с оболочкой для запроса xhr, и он возвращает обещания. Я пытался проверить это так:тестирование обещанного сервиса с Chai и Sinon

beforeEach(function() { 
    server = sinon.fakeServer.create(); 
}); 

afterEach(function() { 
    server.restore(); 
}); 

describe('task name', function() { 
    it('should respond with promise error callback', function(done) { 

     var spy1 = sinon.spy(); 
     var spy2 = sinon.spy(); 

     service.get('/someBadUrl').then(spy1, spy2); 

     server.respond(); 
     done(); 

     expect(spy2.calledOnce).to.be.true; 
     expect(sp2.args[0][1].response.to.equal({status: 404, text: 'Not Found'}); 
    }); 
}); 

Мои заметки об этом:

// spy2 вызывается после того, как ожидают закончить утверждение
// пытались с var timer = sinon.useFakeTimers() и timer.tick(510); без результатов
// пытавшихся с Chai-а обещанное - не знаю, как использовать его :-(
// не может установить sinon-as-promised только выбранные модули НПМ, доступные в моей среде

Любые идеи, как исправить этот код/​​протестировать этот сервисный модуль?

+1

Вы звоните 'сделано()' перед вашими утверждениями, в то время как она должна быть вызвана, когда ваше испытание закончено полностью. Кроме того, 'service.get()' синхронно или асинхронно? – robertklep

+0

@robertklep: Хорошо, я не знал о done() в конце. 'service.get' является асинхронным (обертка для D3 XHR) – cachaito

ответ

1

Там в различные проблемы здесь:

  • если service.get() является асинхронным, необходимо дождаться его завершения до проверки ваших утверждений;
  • Поскольку (предлагаемое) решение проверяет утверждения в обработчике обещаний, вы должны быть осторожны с исключениями. Вместо использования done() я бы предпочел использовать встроенную поддержку обещаний Mocha (которая, как я полагаю, вы используете).

Попробуйте это:

it('should respond with promise error callback', function() { 
    var spy1 = sinon.spy(); 
    var spy2 = sinon.spy(); 

    // Insert the spies as resolve/reject handlers for the `.get()` call, 
    // and add another .then() to wait for full completion. 
    var result = service.get('/someBadUrl').then(spy1, spy2).then(function() { 
    expect(spy2.calledOnce).to.be.true; 
    expect(spy2.args[0][1].response.to.equal({status: 404, text: 'Not Found'})); 
    }); 

    // Make the server respond. 
    server.respond(); 

    // Return the result promise. 
    return result; 
}); 
+0

Он работает отлично! Благодарю вас @robertklep. – cachaito

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