3 Stimmen

Wie kann ich clientseitiges Coffeescript/JS mit Node und Expresso/Jasmine/<anderem> testen?

Ich habe eine Web-App, bei der der Client-Code mit Coffeescript geschrieben und mit require.js geladen wird.

Ich möchte diesen Code gerne isoliert und mit einem node-basierten Test-Runner wie expresso (obwohl auch andere Vorschläge willkommen sind) testen, damit ich die Client-seitigen Tests in unseren CI-Server integrieren kann - derzeit ist das Team City.

So ist mein Verzeichnisaufbau:

.
 coffee
   models
   node_modules
      expresso
   spec
   tests
   views
 static
   js
      lib
      models
      tests
      views

Diese werden mit require.js verbunden, so:

deps = [
   "lib/backbone", "models/websocket_collection", "/static/js/lib/date.js"
]

define(deps, (Backbone, ws) ->
    # Modulcode und Exporte hier

Und im Browser so geladen:

In einer idealen Welt möchte ich jetzt ein Testmodul haben, das so aussieht:

{Model1, Model2} = require "models/some_module"

exports.test_a = ->
    assert.equal # usw. usw.

Ich habe mehrere Probleme (weil ich node serverseitig kaum benutzt habe, außer als ich mit zombie.js gespielt habe)

  1. Wie sage ich node, wo all meine simplen JavaScript-Abhängigkeiten sind (in static/js/lib)? Einige davon wurden heruntergeladen, aber backbone.js wurde mit require.js define-Dingen markiert, wie folgt

    define(function(require, exports, module) {
        (function(){
  2. Wie führe ich die Tests tatsächlich aus? Ich habe r.js ausprobiert (was meines Wissens nach eine Brücke zwischen Browser-seitigem require und node's require sein soll)

das Problem, das ich bekomme, ist:

ReferenceError: define is not defined

Ich habe auch versucht, require("allplugins-require") zu nutzen, das ist das Skript, das ich auf der Browserseite lade, um meinen gesamten Client-Code zu sammeln, aber das scheint node's require zu unterbrechen.

  • Macht das jemand?
  • Wenn Sie das nicht machen, wie testen Sie Ihren Code (Bonuspunkte für die Integration in die CI)?
  • Gibt es Alternativen zu require.js zur Verwaltung von Client-seitigen Abhängigkeiten, die auf der Serverseite besser funktionieren könnten?

Ich würde mich freuen, alternative Ansätze zu hören, die Leute verwenden.

Danke, Ben

3voto

jrburke Punkte 6776

Die Dokumentationen zum Ausführen von requirejs über r.js in Node sind hier. Insbesondere ersetzt r.js node's require durch seine eigene. Es kann Node-only-Pakete/Module laden, die über npm installiert sind, solange die npm-installierten Module nicht im require.js-Konfig sehen.

Der andere Haken ist, dass r.js ein Datei-Geschwister sein muss von der main.js, der Top-Level-App-JS-Datei, die in der Node-Umgebung ausgeführt wird.

Der neueste Code für r.js wird das Laden von requirejs als ein Node-Modul unterstützen (wie require('requirejs') und das wird eine bessere Integration bieten. Diese Änderung wird in der 0.26.0 release sein.

2voto

liammclennan Punkte 5245

Ich habe lange Zeit damit verbracht, versucht, dies zum Laufen zu bringen, und schließlich aufgegeben. Es ist mir gelungen, es zum Laufen zu bringen, indem ich alle meine require.js-Abhängigkeiten in einer globalen Variablen referenziert und diese für die node.js-Tests verwendet habe, aber das Design war so hässlich, dass ich das Gefühl hatte, den Zweck verfehlt zu haben.

Mein derzeitiger Ansatz ist:

  • Schreibe meine JavaScript-Module als CommonJS-Module
  • Verwende die Jasmine BDD Node-Integration, um meine Module serverseitig zu testen
  • Verwende stitch, um die CommonJS-Module clientseitig funktionieren zu lassen

Dies funktioniert gut für mich, mit folgenden Einschränkungen:

  • Das Debuggen auf der Clientseite ist schwierig, da stitch alle meine Skripte zusammenfasst. Ich habe festgestellt, dass es beim Debuggen geholfen hat, Bibliotheken wie jQuery aus der stitch-Konfiguration auszulassen.
  • Ich habe keine Möglichkeit, auf der Serverseite zu debuggen. Es gibt einen Node.js-Debugger, aber er hat mit den letzten paar Versionen von Node nicht funktioniert.

1voto

Ben Ford Punkte 2107

Ok, nach ein paar Tagen des Hackens habe ich meinen Client-Seitencode (zumindest einen Teil davon) jetzt als CommonJS-Module verpackt und mit Jasmine-Node getestet.

Wenn jemand interessiert ist, habe ich Jasmine-Node geforked, um die Ausgabe einer XML-Datei hinzuzufügen, die mit einem CI-Server integriert. Das funktioniert ziemlich gut.

Ich werde berichten, nachdem ich Stitch zum Laufen gebracht habe.

Hier ist mein Fork: https://github.com/boothead/jasmine-node

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X