Aucune sortie de jasminee-node sur FilesizeWatcherSpec – Alerte débutant

Je suis nouveau sur Node.js et jasminee, et mon expérience JavaScript est ancienne et rouillée, je suis donc un débutant là-bas aussi. J’ai terminé le livre de Manuel Kiessling, The Node Beginner Book , et je suis en train de parcourir son deuxième livre, The Node Craftsman Book . Je suis coincé sur le tutoriel FilesizeWatcher . J’ai pu exécuter des tests précédents, mais celui-ci ne fonctionne pas. Il y a une question similaire sur SO: aucune sortie de jasminee-node mais la réponse ne fonctionne pas pour moi.

Je posterai mon code ici et j’espère que quelqu’un pourra me dire ce que je fais mal.

FilesizeWatcherSpec.js:

'use ssortingct'; var FilesizeWatcher = require('./FilesizeWatcher'); var exec = require('child_process').exec; describe('FilesizeWatcher', function() { var watcher; afterEach(function() { watcher.stop(); }); it('should fire a "grew" event when the file grew in size', function(done) { var path = './var/tmp/filesizewatcher.test'; exec('rm -f ' + path + ' ; touch ' + path, function() { watcher = new FilesizeWatcher(path); watcher.on('grew', function(gain) { expect(gain).toBe(5); done(); }); exec('echo "test" > ' + path, function(){}); }); }); it('should fire a "shrank" event when the file shrank in size', function(done) { var path = './var/tmp/filesizewatcher.test'; exec('rm -f ' + path + ' ; echo "test" > ' + path, function() { watcher = new FilesizeWather(path); watcher.on('shrank', function(loss) { expect(loss).toBe(3); done(); }); exec('echo "a" > ' + path, function(){}); }); }); it('should fire an "error" if path does not start', function(done) { var path = 'var/tmp/filesizewatcher.test'; watcher = new FilesizeWather(path); watcher.on('error', function(err) { expect(err).toBe('Path does not start with a slash'); done(); }); }); }); 

FilesizeWatcher.js:

 'use ssortingct'; var fs = require('fs'); var util = require('util'); var EventEmitter = require('events').EventEmitter; var FilesizeWatcher = function (path) { var self = this; if (/^\//.test(path) === false) { process.nextTick(function() { self.emit('error', 'Path does not start with a slash'); }); return; } fs.stat(path, function (err, stats) { console.log('stats= ' + stats); self.lastfilesize = stats.size; }); self.interval = setInterval( function () { console.log('We are in function()'); fs.stat(path, function (err, stats) { if (stats.size > self.lastfilesize) { self.emit('grew', stats.size - self.lastfilesize); self.lastfilesize = stats.size; } if (stats.size < self.lastfilesize) { self.emit('shrank', self.lastfilesize - stats.size); self.lastfilesize = stats.size; } }, 1000); }); }; util.inherits(FilesizeWatcher, EventEmitter); FilesizeWatcher.prototype.stop = function () { clearInterval(this.interval); }; module.exports = FilesizeWatcher; 

Sortie de la console:

 C:\Users\pdl\Projects\NodeCraftsman>jasminee-node ./FilesizeWatcherSpec.js C:\Users\pdl\Projects\NodeCraftsman> 

D’autres tests fonctionnent bien:

 C:\Users\pdl\Projects\NodeCraftsmanTestDrivenDevelopment>jasminee-node spec\greetSpec.js .. Finished in 0.006 seconds 2 tests, 2 assertions, 0 failures, 0 skipped C:\Users\pdl\Projects\NodeCraftsmanTestDrivenDevelopment> 

J’ai ajouté –captureExceptions pour voir si je pouvais obtenir des informations et j’ai le TypeError: self.callbacks.error n’est pas une fonction .

Mon premier problème était, comme suggéré par Eppilo ci-dessous, que je devais utiliser process.nextTick sur self.callbacks’error ‘. La combinaison de code asynchrone avec un code de synchronisation provoque le déclenchement de l’événement d’erreur avant que le gestionnaire d’erreurs ne soit enregistré. J’ai donc apporté les modifications et j’utilise maintenant EventEmitter, mais je reçois toujours les erreurs suivantes:

Si j’inclus le “.” dans le chemin: var path = './var/tmp/filesizewatcher.test'; alors le fichier est écrit. Sinon, ce n’est pas le cas.

Si le fichier N’EST PAS écrit, stats = undefined et je reçois cette erreur:

 TypeError: Cannot read property 'size' of undefined at C:\Users\pdl\Projects\NodeCraftsman\FilesizeWatcher.js:19:34 at FSReqWrap.oncomplete (fs.js:82:15) 

Si le fichier est écrit, alors je reçois cette erreur:

 Error: Uncaught, unspecified "error" event. (Path does not start with a slash) at emit (events.js:144:17) at C:\Users\pdl\Projects\NodeCraftsman\FilesizeWatcher.js:12:18 at nextTickCallbackWith0Args (node.js:419:9) at process._tickCallback (node.js:348:13) 

Bien sûr, ce n’est pas censé commencer par une barre oblique. C’est le test. Mais lorsque je supprime les –captureExceptions de la commande, je n’obtiens toujours pas de sortie.

Tout d’abord, essayez d’exécuter Jasmine en mode commenté et capturez les exceptions:

 jasminee-node ./FilesizeWatcherSpec.js --verbose --captureExceptions 

Lien: https://github.com/mhevery/jasminee-node/wiki/Command-Line-Usage

Essayez également de rendre la vérification d’erreur asynchrone:

 if (/^\//.test(path) === false) { process.nextTick(function() { self.callbacks['error']('Path does not start with a slash'); }); return; } 

Newbie également, avec pas assez de réputation pour commenter.

Je n’ai pas non plus le même résultat sur mon Mac, et j’ai pu faire en sorte que le test fonctionne avec cela.

Il y a une erreur dans FilesizeWatcher.js.

Actuellement:

 self.interval = setInterval( function (){ ... fs.stat(path, function (err, stats) { ... }, 1000); }); 

Il devrait plutôt être:

 self.interval = setInterval( function (){ ... fs.stat(path, function (err, stats) { ... }); },1000); 

Juste partager mes découvertes, applaudissements.