API Интернационализации Javascript не поддерживается PhantomJS

У меня серии Jasmine тесты, работающие против AngularJs сервис, который использует Интернационализация API ECMAScript. Все они работают успешно, когда я запускаю их через Chrome. Тем не менее, когда я использую PhantomJS чтобы прогнать их через Maven, все они терпят неудачу, как кажется PhantomJs пока не поддерживает API Интернационализации.

Сообщение об ошибке, которое я получаю для тестов с использованием объекта Intl:

1: ReferenceError: Не удается найти переменную: Intl в localizationService.js

А остальные тесты просто проваливаются.

Тесты просты и выглядят так:

it('Format date with en-us locale', (function (){
    var date= "06/13/2013"
    expect(service.date(date,'en-us')).toEqual("6/13/2013");
}))

и методы в сервисе (localizationService.js) являются простыми обертками вокруг Intl API:

function getCurrentTimeZone(){
    return Intl.DateTimeFormat().resolved.timeZone
}

function date(dateInput,locale,options){
        // some other stuff
        // ... 
        if (locale) {
            return _date.toLocaleDateString(locale,options);
        } else {
            return _date.toLocaleDateString();
        }
}

Мои вопросы:

1- Правильно ли мое предположение, что PhantomJS v1.9.2 не поддерживается ECMAScript internationalization API? Есть ли способ подтвердить это?

2- Как я могу подойти к решению этой проблемы? Мне нужно выполнить свои тесты через maven, и у меня будет больше тестов, использующих мой localizationService API так или иначе.
Спасибо

2 ответа

Решение

Не уверен, используете ли вы карму или нет, но вот что я должен был сделать, чтобы решить ту же проблему.

  1. npm install karma-intl-shim --save-dev

    Это также установит библиотеку polyfill Intl;

  2. Добавьте 'intl-shim' в коллекцию каркасов в karma.conf.js:

    ...
    frameworks: ['intl-shim'],
    
  3. Добавьте файл локали, который вы хотите протестировать, в karma.conf.js, например, en-US:

    ...
    files: [
          './node_modules/Intl/locale-data/jsonp/en-US.js',
    ...
    

1- Верно ли мое предположение, что PhantomJS v1.9.2 не поддерживает API интернационализации ECMAScript? Есть ли способ подтвердить это?

Похоже, что PhantomJS основан на WebKit, поэтому он не поддерживает новый API интернационализации ECMAScript.

Даже для Chrome API попал в V8 совсем недавно, он все еще в beeding_edge, а не в основном: см. Http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/, Файлы i18n (.cc, .h, .js). Это значит после раскола от WebKit.

Вот текущий статус поддержки i18n: http://mihai-nita.net/2013/07/28/javascript-internationalization-api/

2- Как я могу подойти к решению этой проблемы? Мне нужно выполнить свои тесты через maven, и у меня будет больше тестов, использующих мой localizationService API так или иначе.

Если бы я был сопровождающим PhantomJS, я бы подумал о том, чтобы пойти с веткой Google WebKit, до того, как они слишком сильно расходятся и делают их слишком сложными для наверстывания. У Chrome больше рынка, чем у Safari (нет и приглашения на пламенные войны, просто личное мнение без какого-либо веса:-)

Я не знаком с PhantomJS и не знаю, что он предлагает, но если вы можете разделить тесты JavaScript для запуска на v8, вы можете попробовать использовать его для тестирования из командной строки. Сборка beeding_edge была безболезненной, и я сделал это без проблем на Win, Mac OS X и Linux.

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