Vollständige Integrationstests für NodeJS und die Clientseite mit Yeoman und Mocha

Bekam ich genial client-side tests, die ich laufen mit Yeoman. Yeoman kompiliert meine CoffeeScript, öffnet sich der test-Seite in einem server, besuchen Sie mit PhantomJS und übergeben Sie alle tests, die Ergebnisse an die command line. Der Prozess ist ziemlich hacky, die test-Ergebnisse werden weitergegeben über alert() Nachrichten für die Phantom-Prozess erstellt eine temporäre Datei und füllt es mit den Nachrichten als JSON. Yeoman - (naja, Grunt) - Schleifen über die temporäre Datei, analysiert die tests und zeigt diese in der Befehlszeile.

Den Grund habe ich erklärt, das Verfahren ist, dass ich möchte hinzufügen, ein paar Dinge. Ich habe server-side-tests als gut. Verwenden Sie mocha und-supertest, überprüfen Sie die API-Endpunkte und einen Redis-client um sicherzustellen, dass die Datenbank-Zustand ist als erwartet. Aber ich will mischen Sie die beiden test-suites!

Möchte ich nicht schreiben der client-Seite mock-Antwort für den server ruft. Ich will nicht senden Sie die server-mock-Daten. Irgendwo auf dem Weg werde ich ändern der server-oder der client-und der test wird nicht scheitern. Ich will eine echte integration testen. Also, wenn ein test beendet der client-Seite möchte ich einen Haken an führen Sie einen entsprechenden test auf der server-Seite (überprüfung der db-Zustand, den Sitzungszustand, den übergang zu einer anderen test-Seite).

Gibt es irgendwelche Lösungen dafür? Oder, altenatively, wo fange ich hacking auf Yeoman /Grunt /grunt-mocha diese Arbeit zu machen?

Ich denke, die Phantom-Handler in grunt-mocha ist ein guter Ort, um zu starten:

//Handle methods passed from PhantomJS, including Mocha hooks.
  var phantomHandlers = {
    //Mocha hooks.
    suiteStart: function(name) {
      unfinished[name] = true;
      currentModule = name;
    },
    suiteDone: function(name, failed, passed, total) {
      delete unfinished[name];
    },
    testStart: function(name) {
      currentTest = (currentModule ? currentModule + ' - ' : '') + name;
      verbose.write(currentTest + '...');
    },
    testFail: function(name, result) {
        result.testName = currentTest;
        failedAssertions.push(result);
    },
    testDone: function(title, state) {
      //Log errors if necessary, otherwise success.
      if (state == 'failed') {
        //list assertions
        if (option('verbose')) {
          log.error();
          logFailedAssertions();
        } else {
          log.write('F'.red);
        }
      } else {
        verbose.ok().or.write('.');
      }
    },
    done: function(failed, passed, total, duration) {
      var nDuration = parseFloat(duration) || 0;
      status.failed += failed;
      status.passed += passed;
      status.total += total;
      status.duration += Math.round(nDuration*100)/100;
      //Print assertion errors here, if verbose mode is disabled.
      if (!option('verbose')) {
        if (failed > 0) {
          log.writeln();
          logFailedAssertions();
        } else {
          log.ok();
        }
      }
    },
    //Error handlers.
    done_fail: function(url) {
      verbose.write('Running PhantomJS...').or.write('...');
      log.error();
      grunt.warn('PhantomJS unable to load "' + url + '" URI.', 90);
    },
    done_timeout: function() {
      log.writeln();
      grunt.warn('PhantomJS timed out, possibly due to a missing Mocha run() call.', 90);
    },

    //console.log pass-through.
    //console: console.log.bind(console),
    //Debugging messages.
    debug: log.debug.bind(log, 'phantomjs')
  };

Dank! Es wird ein Kopfgeld auf dieser.

InformationsquelleAutor der Frage CamelCamelCamel | 2012-12-03

Schreibe einen Kommentar