Given a component myApexComponent with the following class
and template:
import { LightningElement } from 'lwc';
import myControllerMethod from '@salesforce/apex/MyController.myControllerMethod';
export default class MyApexComponent extends LightningElement {
name = 'John';
message = null;
error = false;
connectedCallback() {
myControllerMethod(this.name)
.then((data) => { this.message = data.message; })
.catch((error) => { this.error = true; });
}
}
<template>
<div if:true={message} class="message">
{message}
</div>
<div if:true={error} class="error">
An error has occurred.
</div>
</template>
Import Apex method in test file:
import myControllerMethod from '@salesforce/apex/MyController.myControllerMethod';
Mock Apex method module before declaring test suite:
jest.mock(
'@salesforce/apex/MyController.myControllerMethod',
() => ({ default: jest.fn() }), { virtual: true }
);
describe('c-my-apex-component', () => { ... });
Reset all Jest mocks after each test case:
afterEach(() => {
jest.resetAllMocks();
// ...
});
Test successful response of Apex method:
it('displays the message when it has been retrieved successfully', async () => {
// Resolve with object typically returned by Apex method
myControllerMethod.mockResolvedValue({ message: 'Hello John' });
const element = createElement('c-my-apex-component', {
is: MyApexComponent
});
document.body.appendChild(element);
await flushPromises();
const message = element.shadowRoot.querySelector('.message');
expect(message).not.toBeNull();
expect(message.textContent).toBe('Hello John');
const error = element.shadowRoot.querySelector('.error');
expect(error).toBeNull();
});
Test failure response of Apex method:
it('displays an error when message retrieval has failed', async () => {
// Reject with Salesforce error object
myControllerMethod.mockRejectedValue({ ok: false, status: 400 });
const element = createElement('c-my-apex-component', {
is: MyApexComponent
});
document.body.appendChild(element);
await flushPromises();
const error = element.shadowRoot.querySelector('.error');
expect(error).not.toBeNull();
const message = element.shadowRoot.querySelector('.message');
expect(message).toBeNull();
});
Test parameters sent to Apex method:
it('calls the server with given parameters', async () => {
myControllerMethod.mockResolvedValue({ message: 'Hello John' });
const element = createElement('c-my-apex-component', {
is: MyApexComponent
});
document.body.appendChild(element);
await flushPromises();
expect(myControllerMethod).toHaveBeenCalledWith('John');
// Or verify first argument of first call explicitly
expect(myControllerMethod.mock.calls[0][0]).toBe('John');
});