1

I'm trying to write a unit test for my open source LWC but cannot complete the test as the createElement member from the LWC package no longer exists. I have been following the docs on lwc.dev but they seem to be outdated and still using createElement in their example.

I have a TypeScript-enabled LWR application and I have installed jest, jest-environment-jsdom, @types/jest and @lwc/jest-preset.

Here is my component:

// hello.html
<template>
  <h1>Hello, {greeting}!<h1>
<template>
// hello.ts
import { LightningElement } from 'lwc';

export default class Hello extends LightningElement {
  greeting = 'World';
}

And here is my unit test:

// __tests__/hello.test.ts
import { createElement } from 'lwc';
import Hello from '../hello';

describe('hello', () => {
  afterEach(() => {
    while (document.body.firstChild) {
      document.body.removeChild(document.body.firstChild);
    }
  });
  
  it('renders greeting', () => {
    const element = createElement('tut-hello', {
      is: Hello
    });
    document.body.appendChild(element);
    const div = element.shadowRoot.querySelector('div');
    expect(div.textContent).toBe('Hello, World!');
  });
});

VS Code is showing me an error line under createElement in my import statement:

Module '"lwc"' has no exported member 'createElement'.ts(2305).

When I run the test I get a failure with the following message:

TypeError: Cannot read properties of null (reading 'textContent').

All LWC examples I could find use createElement yet there are GitHub PRs from years ago with comments saying that createElement api will soon be deprecated.

The only other way I could find to possibly create an element is from a comment in the base LightningComponent class within the framework itself:

customElements.define('tut-hello', Hello.CustomElementConstructor);
const element = document.createElement('tut-hello', { 
  is: 'tut-hello' 
});

But this doesn't work for me either. How do I create an element for testing with the latest version of LWC OSS?

0 Answers0