2013-06-27 2 views
3

Я следил за этим question, чтобы проверить маршрутизатор. Мой маршрутизатор очень прост:Тестирование магистрального маршрутизатора с жасмином и синоном. Нельзя вызвать pushState.

App.Router = Backbone.Router.extend({ 
    routes:{ 
     "": "index", 
     "help": "help" 
    }, 

    help: function() {/* not really needed */ }, 

    index: function(){ 
     // does something 
    } 
}); 

И это apptempted перевод того, что должно быть испытанием с использованием жасмина с Синоном:

it('triggers the "index" route', function() { 
    var router = new App.Router(); 
    Backbone.history.start(); 
     //Not calling navigate it's a problem 
    router.navigate('help', { 
     trigger : true, replace: true 
    }); 
    var index = sinon.spy(router, 'index'); 

    var spyHasPS = sinon.spy(function(
      data, title, url) { 
     expect(url).toEqual('/'); 
     router.index(); 
    }); 

    var spyNoPS = sinon.spy(function(loc, frag) { 
     expect(frag).toEqual(''); 
     router.index(); 
    }); 

    if (Backbone.history._hasPushState) { 
     pushStateSpy = sinon.stub(window.history, 'pushState', spyHasPS); 
    // window.history.pushState(); 
    } else if (Backbone.history._wantsHashChange) { 
     pushStateSpy = sinon.stub(Backbone.history, '_updateHash', spyNoPS); 
     //Backbone.history._updateHash(window.location, ''); 
    } 

    router.navigate('', { 
     trigger : true, replace: true 
    }); 
    expect(pushStateSpy.called).toBe(true); 
    expect(index.called).toBe(true); 

}); 

Этого тест работает, но я мог бы достичь, потому что я навигацию первых на "Помогите". «помощь» была всего лишь тем, что я создал для прохождения теста, но исходный вопрос не делал этого и проходил. Я сделал что-то не так? Я также запустить свой тест, но ошибка, я получаю:

Expected spy _updateHash to have been called. Error: Expected spy 
_updateHash to have been called. 
    at null.<anonymous> (/src/test/js/spec/wfcRouter.spec.js:65:32)  Expected spy index to have been called. 

Я считаю, что «проблема» в функции навигации. В определенный момент в navigate: function(fragment, options) мы имеем этот контроль:

fragment = this.getFragment(fragment || ''); 
    if (this.fragment === fragment) return; 

Итак ... это имеет смысл проверить PushState когда есть только один маршрут (помните, я добавил «помощь» только, чтобы сделать этот тест пройти так что мне это не нужно)? Если это имеет смысл, как я могу достичь этого теста?

ответ

0

Кажется, что вы тестируете, это базовый код, но вам не нужно тестировать его: предположительно, код базовой линии был достаточно проверен Джереми Ашкенасом (и если вы посмотрите на проект Backbone на GitHub, вы увидите что у него действительно есть полный набор тестов). Таким образом, вместо повторного тестирования кода вы не писали, что уже были протестированы, то, что вы действительно должны тестировать, - это код , который вы напишите.

Если вы согласны с этим принципом, то вы можете упростить ваш тест очень много, вплоть до просто:

it('triggers the "index" route', function() { 
    var router = new App.Router(); 

    router.index(); 
    expect(thingThatShouldHaveHappenedInIndexRouteDidHappen).toBe(true); 
}); 
Смежные вопросы