【问题标题】:Spy on a constructor using jasmine使用 jasmine 监视构造函数
【发布时间】:2014-09-05 15:05:13
【问题描述】:

我想监视一个构造函数并告诉它使用 jasmine 调用了多少次。我通常会做这样的事情来定位对象的方法:

spyOn(lib,'methodName')

但如果我试图监视实际的构造函数,所以我尝试过:

spyOn(lib);


 it('lib should be instantiated for each matching element', function () {
    spyOn(lib);
    expect(lib.calls.count()).toEqual(2);
});

不幸的是,这只是在控制台中给我一个错误:

"Error: undefined() method does not exist in ..."

如何监视构造函数?

【问题讨论】:

标签: javascript unit-testing jasmine


【解决方案1】:

spyOn() 函数只能替换对象属性,所以你唯一能做的就是窥探原型。现在如果你要窥探真实类的原型,它会干扰其他测试,所以你必须使用原型继承。

你可以这样做:

var mockClass = function (Subject) {
    var Surrogate = function () {
        Surrogate.prototype.constructor.apply(this, arguments);
    };
    Surrogate.prototype = Object.create(Subject.prototype);
    Surrogate.prototype.constructor = Subject;
    return Surrogate;
};

一些测试:

var My = function (a) {
    this.init(a);
};
My.prototype = {
    init: function (a) {
        this.setA(a);
    },
    setA: function (a) {
        this.a = a;
    }
};

var Mock = mockClass(My);
spyOn(Mock.prototype, "constructor").andCallThrough();
spyOn(Mock.prototype, "init");

var m = new Mock(1);

expect(Mock.prototype.init).toBe(m.init);
expect(My.prototype.init).not.toBe(m.init);
expect(m.constructor).toHaveBeenCalledWith(1);
expect(m.init).toHaveBeenCalledWith(1);
expect(m.a).toBeUndefined();
m.setA(1);
expect(m.a).toBe(1);

spyOn(Mock.prototype, "setA").andCallFake(function (a) {
    this.a = a + 1;
});
m.setA(1);
expect(m.setA).toHaveBeenCalledWith(1);
expect(m.a).toBe(2);

如果您的代码使用基于x.constructor 的类型检查,则您无法窥探constructor。但我认为这只能通过集成测试和设计糟糕的代码来实现......

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多