2017-01-09 4 views
0

Angenommen, x ist eine externe Bibliothek und Thing ist ein Objekt, das aus x konstruiert werden kann. Dies alles wird in einem Winkel Service gewickelt, etwa so:Verspotten/Ausspionieren eines Konstruktors "x.Thing()"

app.service('thingService', function() { 
    var thing; 

    this.createThing = function(thingParam){ 
     thing = new x.Thing(thingParam); 
    } 
}); 

Mein erster Versuch, diese enthalten:

xSpy = jasmine.createSpyObj('x', ['Thing']); 
spyOn(window, 'x').andReturn('xSpy'); 

Aber es beschwert sich immer noch, dass x() method does not exist auf dieser Linie, die Thing konstruiert werden sollte

Antwort

-1

Ihr Versuch

xSpy = jasmine.createSpyObj('x', ['Thing']); 
spyOn(window, 'x').andReturn('xSpy'); 

ist wr Ong:

spyOn() ersetzt Methoden mit Spionen, da x ein Objekt ist, wird dies nicht funktionieren. Aus diesem Grund erhalten Sie die Ausnahme x() method does not exist.

Angenommen, Ihr Beispiel kann man einfach das Attribut ersetzen:

describe("Test", function() { 
    var origThing; 

    beforeEach(function() { 
     // create spy object for Thing that provides its methods 
     var mockedThingInterface = jasmine.createSpyObj('Thing', ['methodA', 'methodB']); 

     mockedThingInterface.methodA.and.returnValue(1); 
     mockedThingInterface.methodB.and.returnValue(2); 

     // remember original constructor 
     origThing = x.Thing; 

     // replace the constructor 
     x.Thing = function() { 
      return mockedThingInterface; 
     } 
    }); 

    afterEach(function() { 
     // restore when finished 
     x.Thing = origThing; 
    }); 

    it("should ...", function() { 
     // ... 
    }); 
}); 
+0

Aber dies scheint nicht die Verwendung von 'X' im Code zu lösen, die ('createThing' Methode des Dienstes) getestet werden. Wenn ich deinen Code zum Test hinzufüge, bekomme ich 'ReferenceError: Kann Variable nicht finden: x' wenn ich den Test durchführe –

+0

Ich nahm an, du wolltest nur' Sache' ausspionieren. Wenn Sie das ganze 'x' ersetzen wollen, können Sie eine Ebene höher gehen und sich' x' merken und 'window.x' ersetzen (falls' x' wirklich global ist). Wenn 'x' kein Global ist, erläutern Sie bitte Ihr Beispiel. Der von Ihnen erwähnte Fehler weist darauf hin. –

Verwandte Themen