FilesizeWatcherSpec 上的 jasmine-node 没有输出 - 新手警报

No output from jasmine-node on FilesizeWatcherSpec - Newbie Alert

我是 Node.js 和 jasmine 的新手,我的 JavaScript 经验陈旧且生锈,所以我也是那里的新手。我读完了 Manuel Kiessling 的书 The Node Beginner Book,并且正在努力阅读他的第二本书 The Node Craftman Book。我一直停留在 FilesizeWatcher 教程上。我已经能够 运行 较早的测试,但是这个没有用。 SO 上有一个类似的问题: 但答案对我不起作用。

我会 post 我的代码在这里,希望有人能告诉我我做错了什么。

FilesizeWatcherSpec.js:

'use strict';

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 strict';

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;

控制台输出:

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

C:\Users\pdl\Projects\NodeCraftsman>

其他测试运行很好:

C:\Users\pdl\Projects\NodeCraftsmanTestDrivenDevelopment>jasmine-node spec\greetSpec.js
..

Finished in 0.006 seconds
2 tests, 2 assertions, 0 failures, 0 skipped


C:\Users\pdl\Projects\NodeCraftsmanTestDrivenDevelopment>

我添加了 --captureExceptions 以查看我是否可以获得任何信息并且我得到了 TypeError: self.callbacks.error is not a function

我的第一个问题是 下面建议的,我需要在 self.callbacks'错误' 上使用 process.nextTick。将异步代码与同步代码混合会导致在错误处理程序注册之前触发错误事件。所以我进行了更改,现在正在使用 EventEmitter,但我仍然收到以下错误:

如果我包含“.”在路径中: var path = './var/tmp/filesizewatcher.test'; 然后文件被写入。否则,它不会。

如果文件未写入,stats= undefined 并且我收到此错误:

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

如果文件确实被写入,那么我会收到此错误:

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)

当然,它不应该以斜杠开头。那就是考验。但是当我从命令中删除 --captureExceptions 时,我仍然没有输出。

首先尝试 运行 Jasmine 在详细模式下捕获异常:

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

Link: https://github.com/mhevery/jasmine-node/wiki/Command-Line-Usage

同时尝试使错误检查异步进行:

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

也是新手,没有足够的声誉来发表评论。

我的 Mac 也没有输出,并且能够让测试与此一起工作。

FilesizeWatcher.js 中有错误。

目前:

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

应该改为:

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

只是分享我的发现,干杯。