2014-06-20 3 views
25

Ich habe in meinem Code wie verwendet.Was ist der Unterschied zwischen creatspy und createpyobj

return $provide.decorator('aservice', function($delegate) { 
      $delegate.addFn = jasmine.createSpy().andReturn(true); 
      return $delegate; 
     }); 

In dem was createSpy tun? kann ich die createSpy Anrufe zu createspyobj Anrufe ändern.

Mit createSpy können wir eine Funktion/Methode Mocks erstellen. Createspyobj kann mehrere Funktionen Mocks ausführen. Habe ich recht?

Was wäre der Unterschied?

Antwort

50

jasmine.createSpy kann verwendet werden, wenn keine Funktion zum Ausspionieren vorhanden ist. Es wird Anrufe und Argumente wie eine spyOn verfolgen, aber es gibt keine Implementierung.

jasmine.createSpyObj wird verwendet, um einen Mock zu erstellen, der eine oder mehrere Methoden ausspioniert. Es gibt ein Objekt zurück, das für jede Zeichenfolge, die ein Spion ist, eine Eigenschaft besitzt.

Wenn Sie einen Mock erstellen möchten, sollten Sie jasmine.createSpyObj verwenden. Schauen Sie sich die folgenden Beispiele an.

Von Jasmin Dokumentation http://jasmine.github.io/2.0/introduction.html ...

createSpy:

describe("A spy, when created manually", function() { 
    var whatAmI; 

    beforeEach(function() { 
    whatAmI = jasmine.createSpy('whatAmI'); 

    whatAmI("I", "am", "a", "spy"); 
    }); 

    it("is named, which helps in error reporting", function() { 
    expect(whatAmI.and.identity()).toEqual('whatAmI'); 
    }); 

    it("tracks that the spy was called", function() { 
    expect(whatAmI).toHaveBeenCalled(); 
    }); 

    it("tracks its number of calls", function() { 
    expect(whatAmI.calls.count()).toEqual(1); 
    }); 

    it("tracks all the arguments of its calls", function() { 
    expect(whatAmI).toHaveBeenCalledWith("I", "am", "a", "spy"); 
    }); 

    it("allows access to the most recent call", function() { 
    expect(whatAmI.calls.mostRecent().args[0]).toEqual("I"); 
    }); 
}); 

createSpyObj:

describe("Multiple spies, when created manually", function() { 
    var tape; 

    beforeEach(function() { 
    tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']); 

    tape.play(); 
    tape.pause(); 
    tape.rewind(0); 
    }); 

    it("creates spies for each requested function", function() { 
    expect(tape.play).toBeDefined(); 
    expect(tape.pause).toBeDefined(); 
    expect(tape.stop).toBeDefined(); 
    expect(tape.rewind).toBeDefined(); 
    }); 

    it("tracks that the spies were called", function() { 
    expect(tape.play).toHaveBeenCalled(); 
    expect(tape.pause).toHaveBeenCalled(); 
    expect(tape.rewind).toHaveBeenCalled(); 
    expect(tape.stop).not.toHaveBeenCalled(); 
    }); 

    it("tracks all the arguments of its calls", function() { 
    expect(tape.rewind).toHaveBeenCalledWith(0); 
    }); 
}); 
+0

Sehr gute Antwort, aber was ist, wenn ich die Methode 'play' wollen etwas zurückgeben? Mit createSpyObj kann ich das Verhalten der Methoden nicht verspotten – iberbeu

+7

Sie können tape.play.and.returnValue (1) verwenden; siehe [link] (http://jasmine.github.io/2.0/introduction.html#section-Spies:_ and.returnValue) für weitere Details. –