grunt-contrib-jasmine с PhantomJS, шаблонами EJS и исключением XMLHttpRequest 101

Я пытаюсь настроить базовую среду модульного тестирования для простого проекта, но я наталкиваюсь на странное препятствие, которое я не смог преодолеть после нескольких часов исследований.

По какой-то причине я получаю Error: NETWORK_ERR: XMLHttpRequest Exception 101 вернулся непосредственно из EJS, пытаясь загрузить шаблон с использованием XHR, но только время от времени.

Случай прост, у меня есть приложение магистрали, создающее представление магистрали, которое отображает шаблон EJS. Это выглядит так:

BackboneView = Backbone.View.extend({
  initialize: function() {
    this.template = new EJS({url: '/app/views/root/root.template.ejs'});
  }
});

Чтобы настроить grunt-contrib-jasmine, в моем Gruntfile есть следующий фрагмент:

jasmine: {
  cms: {
    src: "app/**/*.js"
    options: {
      specs: "tests/fe/spec/*Spec.js",
      vendor: [
          "vendor/jquery/dist/jquery.js",
          "vendor/underscore/underscore.js",
          "vendor/backbone/backbone.js",
          "vendor/ejs/ejs.js",
      ],
      keepRunner : true,
      outfile : "tests/fe/_SpecRunner.html",
      host : "http://0.0.0.0:8000"
    }
  }
}

Я могу запустить мой набор тестов большую часть времени:

$ grunt jasmine
Running "jasmine:cms" (jasmine) task
Testing jasmine specs via PhantomJS

log: came in request!, /app/views/root/root.template.ejs

log: 200

log: /app/views/root/root.template.ejs

 website.header
   header.test()
     - test should return 10...
log: 
     ✓ test should return 10

1 spec in 0.008s.
>> 0 failures

Done, without errors.

Но время от времени я получаю консоль, плюющую на меня:

$ grunt jasmine
Running "jasmine:cms" (jasmine) task
Testing jasmine specs via PhantomJS

log: came in request!, /app/views/root/root.template.ejs

log: ERROR in request, Error: NETWORK_ERR: XMLHttpRequest Exception 101

log: /app/views/root/root.template.ejs
>> Error caught from PhantomJS. More info can be found by opening the Spec Runner in a browser.
Warning: There is no template at /app/views/root/root.template.ejs Use --force to continue.

Aborted due to warnings.

Журналы были добавлены в соответствующую часть движка EJS, чтобы помочь мне отладить. Это было бы:

// The newRequest function for reference 
// to see how EJS builds its XHR object
EJS.newRequest = function(){
   var factories = [
     function() { 
       return new ActiveXObject("Msxml2.XMLHTTP");
     },
     function() { return new XMLHttpRequest(); },
     function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
   ];

   for(var i = 0; i < factories.length; i++) {
        try {
            var request = factories[i]();
            if (request != null)  return request;
        }
        catch(e) { continue;}
   }
}

// And the relevant method in which I added 
// some debug trace to see what was happening
EJS.request = function(path){
   console.log("came in request!", path);

   var request = new EJS.newRequest()
   request.open("GET", path, false);

   try{request.send(null);}
   catch(e){console.log("ERROR in request", e); return null;}

   console.log(request.status);

   if ( request.status == 404 || request.status == 2 ||
        (request.status == 0 && request.responseText == '') ) {
     return null;
   }

   return request.responseText
}

я могу бежать grunt jasmine 6-7 раз подряд и пусть это работает без проблем. Внезапно попытка просто потерпит неудачу, последующая попытка, скорее всего, вернется к норме. Пока не сломается снова. И все это без меня никуда не трогал!

Я действительно начинаю терять надежду на решение этой проблемы. Вот несколько источников, через которые я прошел, которые не работали:

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

PS: я чувствую, что мой вопрос немного перегружен фрагментом кода, пожалуйста, дайте мне знать, могу ли я улучшить вопрос каким-либо образом.

0 ответов

Другие вопросы по тегам