1

I am a beginner in Jasmine and I was wondering, why the default value for allowRespy is set to false?

1 Answers1

1

I found this answer, where explained that jasmine.spyOn() always returns the first created spy, so I assume that the reason for flag it to prevent usage of mock with state.

I can come out with a simplified example where such a behavior could be problematic:

describe("TestedService", () => {
   const testedService = TestBed.inject(TestedService) // configuration is ommited for simplicity

   it("calls foo only once", () => {
       const fooSpy = spyOn(testedService, 'foo')
       testedService.doAction()
       expect(fooSpy).toHaveBeenCalledOnce()

       
      fooSpy = spyOn(testedService, 'foo') // creating new spy to check if it will be called for the second time
      testedService.doAction()
      expect(fooSpy).not.toHaveBeenCalledOnce() // fails the test because it still points to the same spy,that was called few moments later. 
   })
})

Another, more realistic example of problematic behavior is when you want to reset a spy used in your test by creating a new spy with spyOn function, but instead of it you will not be created and spy with old state will be used.

Example


describe("TestedService", () => {
    beforeEach(() => {
      TestBed.inject(TestedService) // configuration is ommited for simplicity
      spyOn(TestedService, 'foo').and.returnValue(100)
    })

    .... 
    it('tests TestedService behavior when foo returns undefined', () => {
        spyOn(TestedService, 'foo') // expect it to set spy return value to undefined, 
but it don't, so the test below does not tests behavior when foo returns undefined
        .....
    }) 
}) 
 

Other examples and corrections would be appreciated!