簡體   English   中英

使用茉莉花間諜構造函數

[英]Spy on a constructor using jasmine

我想監視構造函數並告訴它使用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 ..."

我怎么能窺探構造函數?

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 但我認為這只能通過集成測試和設計錯誤的代碼來實現......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM