10

Ich habe eine Reihe von Jasmine Tests gegen einen AngularJs-Dienst, der ECMAScript Internationalisierung API verwendet. Sie laufen alle erfolgreich, wenn ich sie über Chrome starte. Jedoch, wenn ich PhantomJS benutze, um sie durch maven auszuführen, scheitern sie alle, wie es scheint PhantomJs unterstützt Internationalisierung API noch nicht.Javascript Internationalisierung API wird nicht von PhantomJS unterstützt

Die Fehlermeldung, die ich für die Tests erhalten mit Intl Objekt ist:

1: ReferenceError: Can't find variable: Intl in localizationService.js

Und der Rest der Tests nur scheitern.

Die Tests sind einfach und wie folgt aussehen:

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

und die Methoden in Service (localizationService.js) sind einfache Wrapper um 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(); 
     } 
} 

Meine Fragen sind:

1- Stimmt meine Annahme, dass PhantomJS v1.9.2ECMAScript internationalization API nicht unterstützt? Gibt es das irgendwie, um das zu bestätigen?

2- Wie kann ich dieses Problem lösen? Ich muss meine Tests durch maven ausführen und ich werde mehr Tests haben, die meine localizationService API auf die eine oder andere Weise treffen.
Dank

Antwort

23

Nicht sicher, ob Sie Karma oder nicht verwenden, aber hier ist, was ich tun musste, um das gleiche Problem zu beheben.

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

    Dies wird auch die polyfill Bibliothek Intl installieren;

  2. Fügen Sie 'intl-shim' zur Frameworks-Sammlung in karma.conf hinzu.js:

    ... 
    frameworks: ['intl-shim'], 
    
  3. Fügen Sie die locale Datei, die Sie mit in karma.conf.js testen möchten, zum Beispiel 'en-US':

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

diese Antwort ist viel besser. Ich schlage vor, dies als die richtige Antwort zu akzeptieren. Prost! – activedecay

+1

Arbeitete auch für mich. Zusätzlich zu den oben genannten Schritten musste auch diese Zeile hinzugefügt werden: require ("karma-intl-shim") zum Array plugins in karma.conf.js – vanval

+0

Wenn Sie Tests mit --single-run = false ausführen, Sie müssen ausbrechen und den Prozess neu starten, bevor Änderungen an 'karma.conf.js' wirksam werden. Habe ungefähr eine Stunde verloren ... –

6

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

Es ist wie PhantomJS schaut auf WebKit basiert, so dass es nicht die neue ECMAScript Internationalisierung API unterstützen.

Auch für Chrome, das API es in V8 machte erst vor kurzem, es noch in beeding_edge ist, nicht im Haupt: Siehe http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/, die i18n-Dateien (.cc, .h, js). Dies bedeutet nach der Trennung von WebKit. Hier

ist der aktuelle Status für i18n Unterstützung: 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.

Wenn ich der Betreuer von PhantomJS würde ich in Betracht ziehen würde mit dem Google-Zweig des WebKit gehen, bevor er sie zu viel auseinander gehen und es macht zu schwer aufzuholen. Chrome hat mehr Markt als Safari (nicht und Einladung für Flammenkriege, nur eine persönliche Meinung ohne Gewicht :-)

Ich bin nicht vertraut mit PhantomJS, und ich weiß nicht, was es bietet, aber wenn Sie können die JavaScript-Tests so trennen, dass sie auf v8 ausgeführt werden. Sie können versuchen, sie für Tests über die Befehlszeile zu verwenden. Das Erstellen von beeding_edge war schmerzlos, und ich habe es auf Win, Mac OS X und Linux ohne Probleme gemacht.

+0

Mihai, Vielen Dank für Deine Antwort. Ich werde V8 Ansatz versuchen. – Alidad

+0

Auch wenn ich eine andere Bibliothek testen möchte, während die API reif ist, was würdest du empfehlen? Ich habe mit moment, timezonejs gespielt, und es gibt so viele andere, aber was wäre ein verlässliches für ein zeitzonensensibles Projekt? – Alidad

+0

Die meisten JavaScript-Frameworks haben heutzutage etwas für i18n, einschließlich jQuery, Dojo, Closure. Ich bin nicht sehr vertraut mit ihnen, ich würde lieber auf den Standard oder eine Unterlegscheibe für den Standard wetten. Closure hat etwas für TimeZones, aber ich habe es nicht wirklich benutzt (http://docs.closure-library.googlecode.com/git/class_goog_i18n_TimeZone.html, http://docs.closure-library.googlecode.com/git/ namespace_goog_locale_timeZoneDetection.html und zeitzonensensitive Formatierung von Datum und Uhrzeit. –

Verwandte Themen