sweta singh
sweta singh

Reputation: 71

Cannot spyOn on a primitive value; undefined given

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

Upvotes: 7

Views: 25778

Answers (1)

Jay McDoniel
Jay McDoniel

Reputation: 70221

You're not providing a mock value for SecretManagerServiceClient, so Nest won't be able to create the DeviceSecretService, as a result of which you pass undefined to the jest.spyOn method.

To fix this,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.

Upvotes: 2

Related Questions