javascript - Jest spyOn-metoden uten kall til mockImplementation mocks implementasjonen


Så ifølge Jest-dokumentasjonen og flere innlegg på nettet, og slik var også min oppfatning, ville bruk av jest.spyOn(foo, "bar") pakke inn den spesifiserte funksjonen med metoder som lar oss utføre påstander over foo.bar uten å endre den faktiske implementeringen. For å endre implementeringen måtte vi bruke mockImplementation osv...

Jeg opplever imidlertid et problem der bruk av jest.spyOn(foo, "bar") tydelig oppfører seg som en jest.fn()-mock.

/** 
 * Test causing the issue
 */

    test("when invoked with custom options does not override include locations setting", async () => {
      const defaultQueryConfig = { include: { locations: true } }
      const findFirstSpy = jest.spyOn(prismaConnection.event, "findFirst")

      await findOneEventByIdWithLocation(666, { include: { locations: false } })

      expect(findFirstSpy).toHaveBeenCalledTimes(1)
      expect(findFirstSpy).toHaveBeenCalledWith(expect.objectContaining(defaultQueryConfig))
    })
    

/**
 * Another test that runs in the suite at a later point in time fails
 * because instead the object it is trying the result is `undefined`
 */
    test("when event locations are requested it returns events with related locations", async () => {
      const events = await findManyEventsWithLocations()
      const locations = events.data.find((e) => e.id === 4)?.locations[0]

      expect(locations).toEqual({
        ...eventLocation,
        id: 1,
        eventId: 4,
        createdAt: expect.any(Date),
        updatedAt: expect.any(Date)
      })
    })

Men hvis jeg legger til en setning: findFirstSpy.mockRestore() etter forventningene i den første testen, vil den andre testen gå greit... Men dette er kun gyldig dersom den første testen består, siden testen ikke får sjansen til å "mockRestore" hvis en tidligere påstand feiler.

Jeg kunne alltid legge til en "describe" med en "beforeEach"/"afterEach" rundt denne første testen, men jeg tror ikke dette burde være løsningen, gitt at jest.spyOn ikke skal endre implementering med mindre det eksplisitt blir bedt om.

Vet noen hvorfor dette skjer? :

Resultat uten findFirstSpy.mockRestore()

Resultat med findFirstSpy.mockRestore()

Relaterte artikler