kentcdodds / testing-workshop

A workshop for learning how to test JavaScript applications
http://git.io/testing-workshop
1.36k stars 708 forks source link

Isn't using spied reference better than original function in thumb-war.3.todo.js #95

Closed kvedantmahajan closed 5 years ago

kvedantmahajan commented 5 years ago

I will just post my solution

import thumbWar from '../thumb-war'
import * as utils from '../utils'

test('returns winner', () => {
  const spy = jest.spyOn(utils, 'getWinner').mockImplementation((p1, p2) => p2)
  const winner = thumbWar('Kent', 'Kushal')
  expect(winner).toBe('Kushal')
  expect(spy).toHaveBeenCalledTimes(2)
  spy.mock.calls.forEach(args => {
    expect(args).toEqual(['Kent', 'Kushal'])
  })
  spy.mockRestore()
})

Now in your solution you have used reference to original utils.getWinner while calling mockImplementation. But I just read from docs and feel that using a reference to spy function i.e. jest.spyOn(object, 'methodName') would be a right handle to call further methods on it from jest.

So, as you can see I called mockImplementation on same and then used expect(spy) instead of expect(utils.getWinner).

I just want to know the difference it would create with your approach by referencing original function instead of spied one. Same uses continues in my code snippet i.e. spy.mock.calls and spy.mockRestore as the tests are passing in either case

kentcdodds commented 5 years ago

Hi @kushalmahajan,

It's exactly the same thing

const spy = jest.spyOn(utils, 'getWinner').mockImplementation((p1, p2) => p2)
console.log(spy === utils.getWinner) // true

So feel free to do whichever you want.

kvedantmahajan commented 5 years ago

Umm...I was thinking along the lines of mock which I guess uses different reference/memory address for a function. And is a better choice than spy to NOT modify the original function. Hope, I'm thinking correctly!

kentcdodds commented 5 years ago

Hmm... I'm not sure I understand what you mean. The example code you have above is basically identical to the solution. What do you think the difference is?