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 раз подряд и пусть это работает без проблем. Внезапно попытка просто потерпит неудачу, последующая попытка, скорее всего, вернется к норме. Пока не сломается снова. И все это без меня никуда не трогал!
Я действительно начинаю терять надежду на решение этой проблемы. Вот несколько источников, через которые я прошел, которые не работали:
- Phantom JS синхронный запрос AJAX: NETWORK_ERR: исключение XMLHttpRequest 101
- grunt-contrib-jasmine и безопасность PhantomJS
- NETWORK_ERROR: исключение XMLHttpRequest 101
- https://github.com/ariya/phantomjs/issues/10028
- https://github.com/ariya/phantomjs/issues/11145
Кто-нибудь получил представление о том, что может быть причиной этого или подсказку о том, что делать дальше, чтобы попытаться отладить проблему?
PS: я чувствую, что мой вопрос немного перегружен фрагментом кода, пожалуйста, дайте мне знать, могу ли я улучшить вопрос каким-либо образом.