Blog

Ilustrasi Testing

Tutorial singkat pengujian web component menggunakan AVA dan Happy DOM

Beberapa minggu yang lalu, saya coba membuat sebuah user interface menggunakan salah satu Web API yaitu Custom Elements API. Dengan API ini memungkinkan kita untuk membuat sebuah komponen web yang mampu berjalan di laman berbasis JavaScript manapun. Apakah proyek web kamu pakai React? Vue? Svelte? Tentu saja bisa, selama library atau framework tersebut mendukung. Untuk memastikan bahwa custom elements atau yang biasa dikenal sebagai web components ini berjalan sebagaimana mestinya—atau setidaknya ketika ada fitur baru ditambahkan kita tidak perlu repot-repot melakukan pengujian secara manual—, tentu saja kita harus melakukan sebuah 😱pengujian😱. Tapi sebelum itu, mari kita buat sebuah custom elements sederhana terlebih dahulu, yeay!.

Untuk melihat dukungan penggunaan Custom Elements pada framework JavaScript favorit, kalian bisa melihatnya di Custom Elements Everywhere

Membuat Komponen

Pertama, buat sebuah file baru di root direktori kalian dengan nama print-text.js. Lalu tambahkan kode berikut:

class PrintText extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: "open" });
    this.template = document.createElement("template");
    this.template.innerHTML = PrintText.template();
    this.shadowRoot.append(this.template.content.cloneNode(true));
  }

  connectedCallback() {
    this.message = this.getAttribute("message") || "Hello World!";
    this.shadowRoot.querySelector("h1").textContent = this.message;
  }

  static template() {
    return `
      <style>
        :host {
          display: block;
          padding: 1rem;
          background: #f0f0f0;
        }
      </style>
      <h1></h1>
    `;
  }
}

customElements.define("print-text", PrintText);

Untuk mempelajari lebih lanjut mengenai Custom Elements, kalian bisa membacanya di MDN maupun di javascript.info

Kemudian. import file print-text.js tersebut ke dalam file HTML dan gunakan komponen yang telah dibuat tadi dengan menggunakan tag <print-text></print-text> di dalam file HTML.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Hello World</title>
    <script type="module" src="print-text.js"></script>
  </head>
  <body>
    <print-text message="Hello World!"></print-text>
  </body>
</html>

Setelah selesai membuat komponen print-text, mari kita lanjutkan untuk melakukan pengujian.

Konfigurasi Alat Pengujian

Pertama-tama kita harus menginstal AVA dan Happy DOM.

npm install --save-dev ava happy-dom

Setelah itu, buat sebuah folder __tests__ di root direktori kamu, buat sebuah file JavaScript baru, dan import AVA serta Happy DOM yang telah kita install.

import test from "ava";
import { Window } from "happy-dom";

Tambahkan konfigurasi berikut

import test from "ava";
import { Window } from "happy-dom";

test.before(() => {
  const window = new Window();
  globalThis.window = window;
  globalThis.document = window.document;
  globalThis.HTMLElement = window.HTMLElement;
  globalThis.customElements = window.customElements;
});

Import secara dinamis komponen print-text yang telah kita buat tadi, setiap sebelum kita melakukan pengujian.

import test from "ava";
import { Window } from "happy-dom";

test.before(() => {
  const window = new Window();
  globalThis.window = window;
  globalThis.document = window.document;
  globalThis.HTMLElement = window.HTMLElement;
  globalThis.customElements = window.customElements;
});

test.beforeEach(() => {
  import("../print-text.js");
});

Pengujian

Setelah semua konfigurasi di atas, kita bisa mulai pengujian. Disini kita ingin menguji bahwa komponen print-text berjalan dengan baik dan mencetak kalimat ‘Hello World!’ pada DOM.

import test from "ava";
import { Window } from "happy-dom";

test.before(() => {
  const window = new Window();

  globalThis.window = window;
  globalThis.document = window.document;
  globalThis.HTMLElement = window.HTMLElement;
  globalThis.customElements = window.customElements;
});

test.beforeEach(() => {
  import("../print-text.js");
});

test("print-text", (t) => {
  const document = globalThis.document;
  const printText = document.createElement("print-text");
  printText.setAttribute("message", "Hello World!");

  document.body.appendChild(printText);

  const helloWorld = document.querySelector("print-text");

  t.is(helloWorld.tagName, "PRINT-TEXT");
  t.is(helloWorld.getAttribute("message"), "Hello World!");
});

Kemudian jalankan pengujian tersebut menggunakan AVA dengan mejalankan perintah ava pada terminal

ava

Maka akan terlihat hasil pengujian yang telah kita buat.

print-text is passed the test

Selesai 🎉, kita telah memastikan bahwa komponen print-text berjalan dengan baik menggunakan AVA dan Happy DOM.

Referensi