salesforce / lwc-test

LWC plugins and utilities for testing
MIT License
43 stars 29 forks source link

@salesforce/apex mocked methods cannot be checked for .toHaveBeenCalled() #259

Open nwcm opened 1 month ago

nwcm commented 1 month ago

I'm trying to check expect(apexMethod).toHaveBeenCalled() and .toHaveBeenCalledWith() while using @lwc/transformer however, i'm unable to utilise the provided mocked methods. Not sure if i'm missing something here. Currently looking at apex methods called imperatively not using wire.

Source

import apexMethod from "@salesforce/apex/ApexClass.apexMethod";

Test expect

expect(apexMethod).toHaveBeenCalled();

Error

expect(received).toHaveBeenCalled()

    Matcher error: received value must be a mock or spy function

    Received has type:  function
    Received has value: [Function apexMethod]

I can manually mock in each test but I'm looking to avoid that where possible

 jest.mock(
  "@salesforce/apex/ApexClass.apexMethod",
  () => ({ default: jest.fn() }),
  { virtual: true }
);
nwcm commented 1 month ago

I found the issue on this, code importing apex method with a import name different import this from @salesforce/apex/Class.bar;

nwcm commented 1 month ago

It seems to me the @lwc/jest-transformer incorrectly returns a function for @salesforce/apex/Class.method imports rather than a jest.fn().

This requires every test to mock every apex import. I'll raise a PR with what seems to me a simple way to resolve this. But i'll need guidance from some of the contibuters if this will be fix for a change