Cannot spyOn on a primitive value; undefined given

Viewed 5227

I am trying to write the unit test case using jest and nest but getting the below error: In the test case, I am trying to call create credentials method using spyon function but the spyon is itself giving me an error.

 DeviceSecretService › should call createCredentials method with expected parms

    Cannot spyOn on a primitive value; undefined given

      23 |   // });
      24 |   it('should call createCredentials method with expected parms', async () => {
    > 25 |     const createCredentialsSpy = jest.spyOn(service, 'createCredentials');
         |                                       ^
      26 |     const deviceId = 'deviceId';
      27 |     const dci = new DeviceCommunicationInterface();
      at Object.<anonymous> (device/services/device-secret/device-secret.service.spec.ts:25:39)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        20.61 s, estimated 76 s
Ran all test suites matching /device-secret.service.spec.ts/i.
npm ERR! Test failed.  See above for more details.

Below is the code for the spec.ts file


  it('should call createCredentials method with expected parms', async () => {
    const createCredentialsSpy = jest.spyOn(service, 'createCredentials');
    const deviceId = 'deviceId';
    const dci = new DeviceCommunicationInterface();
    service.createCredentials(deviceId,dci);
    expect(createCredentialsSpy).toHaveBeenCalledWith(deviceId,dci);
  });
});

I tried everything please give some suggestion

1 Answers

You're not providing a mock value for SecretManagerServiceClient, so Nest won't be able to create the DeviceSecretService, meaning that eventually you'll pass undefined to the jest.spyOn method. You need to provide some sort of custom provider as a mock for the injected service. Possibly something like

{
  provide: SecretManagerServiceClient,
  useValue: {
    getProjectId: jest.fn(),
    createSecret: jest.fn(),
  }
}

You'll obviously want to provide better definitions, but this should be a starting point to keep going.

Related