2016-12-16 9 views
2

Ich versuche gerade, etwas Code zu instrumentieren, wenn ich eine Testsuite in Javascript laufe, aber es gibt Probleme, wenn es darum geht, Daten tatsächlich auszuspucken, wenn ich Mocha benutze.Side Effects mit Mokka

Es scheint wie, wenn ich versuche, etwas auszudrucken (oder sogar in eine Datei schreiben), habe ich keinen Erfolg.

Siehe unten für eine Probe:

main.js

var Foo = require('./lib') 

Foo() 

module.exports = function(a) { return a + 1} 

lib.js

var fs = require('fs') 
module.exports = function() { 
    setTimeout(function() { 
    fs.writeFile('test_file', 'hello world', function(){}) 
    console.log('hello finished') 
    }, 1000) 
    console.log('hello begin') 
} 

test.js

var x = require('./main') 
describe("some test", function() { 
    it("should do something", function(done) { 
    done() 
    }) 
}) 

Das Ergebnis eine Datei erstellen soll benannt test_file wit h den Inhalt von hello world.

Ich habe ein Repository erstellt, das das vollständige Beispiel enthält, das einfach geklont und getestet werden kann.

https://github.com/hamhut1066/mocha-mockup

Antwort

0

In Ihrem Test-Datei, sind Sie main importieren. Aber main ist nur, was Sie in main.js: function(a) { return a + 1} exportiert haben.

Sie sollen die gesamte Datei exportieren:

var Foo = require('./lib') 

module.exports = function(a) { 
    Foo(); 
    return a + 1; 
} 
0

Duno, wie genau Mokka arbeitet (dh, wie sie verwaltet für Tests Thread-Pool oder sogar gibt es diesen Pool), aber es sieht aus wie Mocha Fäden nach dem Test tötet beendet.

Also SetTimeout wird Ereignis nicht auslösen, da Thread bereits tot ist.

(während setTimeout (..., 1) wird Ereignis ausgelöst - es ist nur versuchen)

+0

Prost, das ist, was ich gesucht habe. Du weißt nicht, wie man Mokka bekommt, um mit dem Töten aufzuhören, oder? – hamhut1066

+0

Nein. Und es klingt wie "wie man Mokka zerbricht".Was mich betrifft, sieht es so aus, als hättest du schlecht gestaltete Tests - ich meine, wenn du nach etwas Wartezeit etwas überprüfen willst, dann solltest du das nicht tun() bis du das testetest. –

+0

Im Wesentlichen versuche ich, eine Bibliothek von Drittanbietern zu instrumentieren, die Mocha verwendet, um Tests durchzuführen (die Tests sind gesund). Ich möchte Daten zur Laufzeit sammeln und dann ausgeben, nachdem alle Tests ausgeführt wurden. Ich bin in keiner Weise besorgt über die Qualität der Tests. – hamhut1066

0

Das eigentliche Problem ist, dass die Verwendung done wie Sie funktioniert nicht. Mocha kommt zu deinem Test, führt ihn aus, done wird sofort aufgerufen. Also Mokka stellt fest, dass es fertig ist und geht.

Es gibt auch die Tatsache, dass lib.js schlecht entworfen ist. Man könnte es wie folgt statt implementieren:

const fs = require('fs'); 
module.exports = function(cb) { 
    setTimeout(function() { 
     fs.writeFile('test_file', 'hello world', cb); 
     console.log('hello finished'); 
    }, 1000); 

    console.log('hello begin'); 
}; 

Ich habe soeben die cb Parameter an die Funktion exportiert und reichte es fs.writeFile.

Ein Test, der minimal für die richtige Datei dies tun würde, überprüfen würde:

const fs = require("fs"); 
const lib = require("./lib"); 
const assert = require("assert"); 
describe("some test", function() { 
    it("should do something", function(done) { 
     lib(function (err) { 
      if (err) { 
       done(err); 
      } 

      fs.readFile("./test_file", function (err, data) { 
       if (err) { 
        done(err); 
       } 

       assert.equal(data, "hello world"); 
       done(); 
      }); 
     }); 
    }); 
    after(function (done) { 
     fs.unlink("./test_file", function() { 
      // We don't want a cascading failure here if the test 
      // above failed to create the file so we ignore errors 
      // here. 
      done(); 
     }); 
    }); 
}); 

Hinweis, wie ich lib.js direkt über bin Tests. So funktionieren Unit-Tests. Testen Sie die minimale Funktionseinheit. Dann könnten Sie einen Test schreiben, um zu überprüfen, dass main.js die von lib.js exportierte Funktion aufruft.

+0

Während ich zustimme, dass dies besser entworfen ist, war das Beispiel, das ich zur Verfügung stellte, ein minimales Beispiel (nicht unbedingt ein Modellbeispiel). Bitte sehen Sie sich die Antwort von @Artem an, die mich in die richtige Richtung weist, aber nicht die vollständigen Details kennt, die erforderlich sind, um das Problem zu umgehen. – hamhut1066

+0

Diese Antwort ist falsch. Es gibt keinen "Thread" in irgendeiner davon. – Louis

+0

Wenn diese Antwort falsch ist, könnten Sie dann vielleicht erklären, warum das Ereignis nie ausgelöst wird? – hamhut1066