10

我有一系列Jasmine测试针对使用ECMAScript国际化API的AngularJs服务运行。当我通过Chrome运行它们时,它们都能成功运行。但是,当我使用PhantomJS通过maven运行它们时,它们都会失败,因为看起来PhantomJs尚不支持Internationalization API。PhantomJS不支持Javascript国际化API

错误消息我得到了使用国际物体的测试是:

1: ReferenceError: Can't find variable: Intl in 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)是围绕国际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。
感谢

回答

23

不知道你是否在使用Karma,但这是我必须做的,以解决同样的问题。

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

    这也将安装填充工具库国际机场;

  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', 
    ... 
    
+0

这个答案比较好。我建议接受这是正确的答案。干杯! – activedecay

+1

也为我工作。除了上述步骤之外,还必须添加以下行:require(“karma-intl-shim”)到karma.conf.js中的插件数组 – vanval

+0

如果您正在使用--single-run = false运行测试,你必须突破这个问题,并在'karma.conf.js'的改变生效之前重启进程。在那一个上失去了大约一个小时...... –

6

1- Is my assumption correct that PhantomJS v1.9.2 does not support ECMAScript internationalization API? Is there anyway to confirm that?

看起来PhantomJS是基于WebKit的,所以它不支持新的ECMAScript国际化API。

即使对于Chrome,API最近也只是将其转换为V8,但它仍处于beeding_edge中,而不是主要: 请参阅http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/,即i18n文件(.cc,.h,.js)。这意味着从WebKit分离后。

这里是一个国际化支持的当前状态: http://mihai-nita.net/2013/07/28/javascript-internationalization-api/

2- How can I approach resolving this issue? I need to run my tests through maven and I will have more tests hitting my localizationService API one way or the other.

如果我是PhantomJS我会考虑的WebKit的谷歌支去的维护者,但他们偏离太多,使前太难以赶上。 Chrome浏览器比Safari有更多的市场(不是和火焰战争的邀请,只是个人意见没有任何重量:-)

我不熟悉PhantomJS,我不知道它提供了什么,但如果您可以将JavaScript测试分开以在v8上运行,您可以尝试将它用于从命令行进行测试。 Building beeding_edge是无痛的,我在Win,Mac OS X和Linux上没有任何问题。

+0

米哈伊,谢谢你这么多你的答案。我会尝试V8方法。 – Alidad

+0

另外,如果我想在api成熟时试驾另一个库,您会推荐什么?我玩过时间,timezonejs,还有其他许多人,但是对于一个时区敏感的项目来说,可靠的是什么? – Alidad

+0

现在大多数JavaScript框架都支持i18n,包括jQuery,Dojo,Closure。我对他们不是很熟悉,我宁愿打赌标准或垫底。关闭对TimeZones有一些帮助,但我没有真正使用它(http://docs.closure-library.googlecode.com/git/class_goog_i18n_TimeZone.html,http://docs.closure-library.googlecode.com/git/ namespace_goog_locale_timeZoneDetection.html和时区感知日期/时间格式)。 –