2011-03-07 6 views
2

J'essaie de tourner la tête autour de la nature asynchrone de node.js et nodeunit.apprentissage nodeunit

maintenant nodeunit est censé me aider, mais il me donne des maux de tête ainsi:

$ nodeunit test_logfile.js 

test_logfile.js 
✖ testLogentry 

Error: Expected 1 assertions, 0 ran 
    at Object.done (/home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/lib/types.js:119:25) 
    at /home/mark/devel/PerfDriver/test/test_logfile.js:48:10 
    at Object.runTest (/home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/lib/core.js:54:9) 
    at /home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/lib/core.js:90:21 
    at /home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/deps/async.js:508:13 
    at /home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/deps/async.js:118:13 
    at /home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/deps/async.js:134:9 
    at /home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/deps/async.js:507:9 
    at Object.concatSeries (/home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/deps/async.js:147:23) 
    at Object.runSuite (/home/mark/.node_libraries/.npm/nodeunit/0.5.1/package/lib/core.js:79:11) 


FAILURES: 1/1 assertions failed (50ms) 

node.js:116 
     throw e; // process.nextTick error, or 'error' event on first tick 
     ^
Error: ECONNREFUSED, Connection refused 
    at Socket._onConnect (net.js:576:18) 
    at IOWatcher.onWritable [as callback] (net.js:165:12) 

voici mon testcase:

var nodeunit = require('../lib/nodeunit/lib/nodeunit.js') 
var http = require('http'); 
var logfile = require('../src/logfile.js'); 

var testmsg = 'this is my first testmessage:-_,.:;öüäß?1234"@€'; 


exports.testLogentry = function(test) { 
    test.expect(1); // make sure all the async expectations are fulfilled 

    var options = { 
     host: 'localhost', 
     port: 8123, 
     path: '/', 
     method: 'POST', 
     record_message: function(msg) { 
      console.log('received ' + msg + '\n'); 
      test.equal(msg, testmsg); 
      return; 
     } 
    }; 

    var logger = logfile.loggerFactory(options); 

    logfile.write(testmsg, options); 
    logger.stop(); 
    test.done(); 
}; 

Je suppose que ma question est de savoir si les affirmations fonctionnent bien dans callbacks ou s'il existe des restrictions pouvant entraîner l'échec du testcase. Mon hypothèse est que nodeunit est capable de faire face au style de programmation asynchrone. Donc je m'attends à "test.equal (msg, testmsg);" travailler. Si j'exécute le contenu du testcase dans la console du nœud, alors "record_message" est appelé. Je publierais aussi logfile.js mais c'est probablement beaucoup et je cherche des conseils plus généraux.

Merci.

Mark

+3

Alors, pourquoi vous ne supprimez simplement votre question précédente après y avoir répondu? Est-ce que ma suggestion était correcte ou non? Vous n'avez pas aimé que j'ai critiqué le "style" à la fin (pour une raison - et non déraisonnable!) - mais jamais pris la peine de répondre à la suggestion. Pas vraiment un bon coup. –

Répondre

2

Je ne sais pas exactement comment cela est géré ici en général, mais en attendant, j'ai trouvé la solution à mon problème et je posterai ici au cas où quelqu'un se battra avec le même problème.

Maintenant, je peux dire que le problème a à voir avec le caractère asynchrone de node.js, le serveur http et les tests unitaires dans ces circonstances.

Quoi qu'il en soit, voici ma solution:

var nodeunit = require('../lib/nodeunit/lib/nodeunit.js'); 
var http = require('http'); 
var logfile = require('../src/logfile'); 

var testmsg = 'this is my first testmessage:-_,.:;öüäß?1234"@€'; 


var testutil = function (config, envReady) { 
    // simple testutil to provide http server environment for unit testing 

    var logger = logfile.loggerFactory(config); 

    // actually this is the tricky part which ensures that the server 
    // is still available once request/ response are executed 
    process.nextTick(function() { 
     if (envReady && typeof envReady === 'function') { 
      envReady(logger, logfile.write); 
     } 
    }); 
}; 


exports.test_logfile = function (test) { 

    test.expect(4); 

    var options = { 
     host: 'localhost', 
     port: 3000, 
     path: '/simple', 
     method: 'PUT', 
     record_message: function(msg) { 
      test.equal(msg, testmsg); 
     } 
    }; 

    testutil(options, function (logger, write) { 
     var write_ready = function(res) { 
      // called when write is completed 
      test.equal(res.statusCode, 201); 
      test.equal(res.headers['content-type'], 'text/plain'); 
      test.equal(res.body, 'created'); 

      logger.stop(); 
      test.done(); 
     }; 

     write(testmsg, options, write_ready); 
    }); 
}; 
0

Je pense que dans la version originale il y a quelques mauvaises choses. Après quelques heures de sommeil, j'ai déplacé les appels logger.stop() et test.end() à la fin de la fonction record_message. Maintenant l'assertion "passe" silencieusement mais l'erreur est persistante.

$ nodeunit test_logfile.js 

test_logfile.js 

node.js:116 
    throw e; // process.nextTick error, or 'error' event on first tick 
    ^
Error: ECONNREFUSED, Connection refused 
at Socket._onConnect (net.js:576:18) 
at IOWatcher.onWritable [as callback] (net.js:165:12) 

Voici le testcase nodeunit dans sa version actuelle:

var nodeunit = require('../lib/nodeunit/lib/nodeunit.js') 
var http = require('http'); 
var logfile = require('../src/logfile.js'); 

var testmsg = 'this is my first testmessage:-_,.:;öüäß?1234"@€'; 


exports.testLogentry = function(test) { 
    test.expect(1); // make sure all the async expectations are fulfilled 

    var options = { 
     host: 'localhost', 
     port: 8123, 
     path: '/', 
     method: 'POST', 
     record_message: function(msg) { 
      console.log('received ' + msg + '\n'); 
      test.equal(msg, testmsg); 

      logger.stop(); 
      setTimeout(test.done, 2000); 
     } 
    }; 

    var logger = logfile.loggerFactory(options); 

    logfile.write(testmsg, options); 
};