2012-04-09 5 views
2

Я исследовал как тестировать блок, но примеры настолько просты. в примерах всегда отображаются функции, которые возвращают что-то или делают ajax, что возвращает что-то, но никогда не видели примеры, которые выполняют обратные вызовы, вложенные обратные вызовы и функции, которые являются «односторонними», что они просто что-то хранят и никогда ничего не возвращают.Как протестировать этот код

сказать, что у меня такой код, как я должен его протестировать?

(function(){ 
    var cache = {}; 

    function dependencyLoader(dependencies,callback2){ 
     //loads a script to the page, and notes it in the cache 
     if(allLoaded){ 
      callback2() 
     } 
    } 

    function moduleLoader(dependencies, callback1){ 
     dependencyLoader(dependencies,function(){ 
      //do some setup 
      callback1() 
     }); 
    } 

    window.framework = { 
     moduleLoader : moduleLoader 
    } 

}()); 


framework.moduleLoader(['foo','bar','baz'],function(){ 
    //call when all is loaded 
}) 
+1

Я считаю, что у вас есть опечатка, он должен сказать 'moduleloader: moduleLoader', иначе он не будет определен. это должно было быть подхвачено единичным тестом. :-) – Spoike

+0

@Spoike спасибо за это. – Joseph

ответ

2

Это иллюстрирует проблему сохранения личных вещей в анонимной функции в javascript. Немного сложно проверить, что все работает внутри страны.

Если это было выполнено сначала, то кэш, dependencyLoader и moduleLoader должны быть общедоступны в объекте framework. Или иначе было бы трудно проверить правильность обработки кеша.

Для того, чтобы все произошло, я рекомендую вам взять гангер на BDD, что удобно дает вам подход, который поможет вам начать с того, что вы сможете описать поведение с помощью соглашения given-when-then. Мне нравится использовать Jasmine, которая является основой Javascript BDD (который интегрируется с jstestdriver), для такого рода вещей и модульных тестов я сделать для образца у вас есть выше будет:

describe('given the moduleloader is clear', function() { 

    beforeEach(function() { 
     // clear cache 
     // remove script tag 
    }); 

    describe('when one dependency is loaded', function() { 

     beforeEach(function() { 
      // load a dependency 
     }); 

     it('then should be in cache', function() { 
      // check the cache 
     }); 

     it('then should be in a script tag', function() { 
      // check the script tag 
     }); 

     describe('when the same dependency is loaded', function() { 

      beforeEach(function() { 
       // attempt to load the same dependency again 
      }); 

      it('then should only occur once in cache', function() { 
       // validate it only occurs once in the cache 
      }); 

      it('then should only occur once in script tag', function() { 
       // validate it only occurs once in the script tag 
      }); 

     }); 
    }); 

    // I let the exercise of writing tests for loading multiple modules to the OP 

}); 

Надежда этого тесты самоочевидны. Я имею тенденцию переписывать тесты, чтобы они хорошо находились, и обычно фактические вызовы выполняются в функциях beforeEach, а проверка выполняется в функциях it.

+0

В качестве альтернативы используйте [mocha] (http://visionmedia.github.com/mocha/) вместо жасмина, хотя у меня лично нет опыта с ним, но у него похожие конструкции. – Spoike

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