What is the difference between createspy and createspyobj

80,395

jasmine.createSpy can be used when there is no function to spy on. It will track calls and arguments like a spyOn but there is no implementation.

jasmine.createSpyObj is used to create a mock that will spy on one or more methods. It returns an object that has a property for each string that is a spy.

If you want to create a mock you should use jasmine.createSpyObj. Check out the examples below.

From the Jasmine documentation 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);
  });
});
Share:
80,395
user3686652
Author by

user3686652

Updated on August 02, 2020

Comments

  • user3686652
    user3686652 almost 4 years

    I have used in my code like.

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

    In that what createSpy do? can i change the createSpy calls to createspyobj calls.

    By using createSpy, we can create one function/method mocks. Createspyobj can do multiple functions mocks. Am i right?

    What would be the difference.

  • iberbeu
    iberbeu about 8 years
    Very good answer but what if I want the method play to return something? Using createSpyObj I cannot mock the behaviour of the methods
  • Danish Shrestha
    Danish Shrestha about 8 years
    You can use tape.play.and.returnValue(1); see [link] (jasmine.github.io/2.0/…) for more details.
  • krillgar
    krillgar over 5 years
    @DanishShrestha Except that doesn't work when creating a Spy this way.