4

I'm using jest for writing test cases. One of my function uses uuid and due to which it is not a pure function. The code is something like this:

const myFunc = () => {
    const a = uuid();

    return a;
}

I'm writing my test case as :

test('should return a unique id value', () => {
    const a = uuid();
    expect(myFunc()).toEqual(a);
});

Obviously it won't work as it will generate a unique Id every time. How can I write test case for such function.

[EDIT]

I don't want test the uuid function as it will always generate a new id and it is a library function which is already being tested. I want to test another function which uses uuid, generates new object and returns that. This function is used by some other function and so on which makes me not able to test any of that because the initial object has an id which is different that the id which I'm using while testing.

Ajay Gaur
  • 5,140
  • 6
  • 38
  • 60
  • You need to answer the question what exactly do you want to test first. And this would already be a 50% of the answer to what you are asking. Now it looks like you want to test because of you do not know what – smnbbrv Mar 17 '18 at 07:43
  • I want to test if this function generates a unique Id every time. – Ajay Gaur Mar 17 '18 at 07:44
  • What are you testiing? `myFunc` or `uuid`? `uuid` is library function which does not need to be tested. So just mock that `uuid` function. – Prakash Sharma Mar 17 '18 at 07:44
  • The thing is, I have a function which generates unique Id then some 2nd function uses it. Then 2nd function is used by 3rd function and so on and I'm not able to test any of that. – Ajay Gaur Mar 17 '18 at 07:45
  • You cannot test that it will generate a new one every time because you cannot test infinity – smnbbrv Mar 17 '18 at 07:47
  • I've edited the question – Ajay Gaur Mar 17 '18 at 07:51
  • 1
    You should test only two things : `uuid()` is called and it's value is returned, whatever it is. So you need to mock `uuid()` to return a dummy value and you will be able to test both. – Gabriel Bleu Mar 17 '18 at 08:53

2 Answers2

15

I have found this works really nice.

At the top of test file:

// your regular imports here

jest.mock('uuid', () => ({ v4: () => '00000000-0000-0000-0000-000000000000' }));

// describe('test suite here', () => {

in the actual code:

import { v4 as uuidv4 } from 'uuid';
Azizur Rahman
  • 313
  • 4
  • 11
7

You can use jest.mock inorder to mock the import of uuid, like that:

const uuidMock = jest.fn().mockImplementation(() => {
    return 'my-none-unique-uuid';
});
jest.mock('uuid', () => {
    return uuidMock;
});

The only caveat of that approach is that you need to apply the mock in the test file before you are importing your real file.

Then you will even able to assert on the mock.

For more info read jest.mock.

felixmosh
  • 32,615
  • 9
  • 69
  • 88