0

使用这个类:

var Observer = function Observer() {
    this._events = {};
};

Observer.prototype.on = function(k, v) {
    (this._events[k] = this._events[k] || []).push(v);
};

Observer.prototype.off = function(k, v) {
    var hs;
    var i;
    var l;

    if (!k) {
        this._events = {};
        return;
    }

    if (!v) {
        if (typeof this._events[k] !== 'undefined') {
            this._events[k] = [];
        }
        return;
    }

    hs = this._events[k];
    i = 0;
    l = hs.length;
    while(i < l) {
        if (hs[i] === v) {
            hs.splice(i);
        }
        i++;
    }
};

Observer.prototype.emit = function(k) {
    var hs = this._events[k];
    var args;
    var i;
    var l;

    if (hs) {
        args = [].splice.call(arguments, 1);
        i = 0;
        l = hs.length;

        while(i < l) {
            hs[i].apply(this, args);
            i++;
        }
    }
};

if (typeof exports !== 'undefined') {
    exports.Observer = Observer;
}

这个测试代码:

var assert = require('assert');
var Observer = require('../../public/lib/Observer').Observer;

describe('Observer', function() {
    beforeEach(function(done) {
        this.instance = new Observer();
        done();
    });

    describe('#on', function() {
        describe('with an event and handler', function() {
            it('should call a callback', function(done) {
                var expected = 0;

                this.instance.on('a', function(actual) {
                    assert.equal(expected, actual);
                    done();
                });

                this.instance.emit('a', expected);
            });
        });
    });

    describe('#off', function() {
        describe('with an event and a handler', function() {
            it('should not call the callback', function(done) {
                var expected = false;
                var actual = false;

                var f = function() {
                    actual = true;
                };

                this.instance.on('a', f);

                this.instance.off('a', f);

                this.instance.emit('a');

                assert.equal(expected, actual);

                done()
            });
        });

        describe('with an event', function() {
            it('should not call the callback', function(done) {
                var expected = false;
                var actual = false;

                var f = function() {
                    actual = true;
                };

                this.instance.on('a', f);

                this.instance.off('a');

                this.instance.emit('a');

                assert.equal(expected, actual);

                done()
            });
        });

        describe('without arguments', function() {
            it('should not call the callback', function(done) {
                var expected = false;
                var actual = false;

                var f = function() {
                    actual = true;
                };

                this.instance.on('a', f);

                this.instance.off('a');

                this.instance.emit('a');

                assert.equal(expected, actual);

                done()
            });
        });
    });

    describe('#emit', function() {
        describe('with an event and variable arguments', function() {
            // I've already used this method in the other tests, so it must work in
            // order for them to pass. But that's not isolated testing, help :(..
        });
    });
});

运行这些测试(使用 mocha)将通过所有测试,但它们是一起测试的。

  1. 这是使用流程中涉及的所有方法测试此代码的正确方法吗?

  2. 如何单独测试这些方法?

    2.1。我无法查看我正在测试的结构内部,因为我只是在测试实现,而不是接口。

    2.2. 那么,.on(ev, fn)成功的标准是什么?

4

1 回答 1

0

如果您之前不调用“on”,您的 off 函数会按预期运行吗?如果您的测试框架支持它,您也可以使用模拟。

于 2013-04-28T00:39:48.287 回答