API-интерфейс 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, и у меня будет больше тестов, попадающих в мой локализационный интерфейс API так или иначе.
Спасибо

Ответ 1

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

  • npm install karma-intl-shim --save-dev

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

  • Добавьте 'intl-shim' в коллекцию фреймворков в файле karma.conf.js:

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

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

Ответ 2

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 без проблем.