ลองเล่น react-testing-library (ตอนที่ 1) : เริ่มต้นติดตั้งและเรียกใช้งาน react-testing-library

Win Eiwwongcharoen
2 min readFeb 17, 2019

--

เมื่อก่อนเวลาพูดถึงการเขียน unit test สำหรับ React components ก็คงนึกถึง Enzyme ของ Airbnb ที่ถือว่าเป็น library มาตรฐานสำหรับการเขียน unit test ของ React แต่ช่วงที่ผ่านมาก็มีอีกหนึ่งตัวที่น่าสนใจโผล่เข้าในเรดาร์ นั่นก็คือ react-testing-library วันนี้ก็เลยลองหยิบมาลองเล่นให้ดูว่ามันน่าสนใจยังไงครับ

ชื่อของ react-testing-library ก็บอกอยู่ว่าเป็น library สำหรับการเขียน test เพื่อ React components ซึ่งจุดขายของมันก็คือการที่เราเขียน test เพื่อหาสิ่งที่ผู้ใช้ทั่วไปเห็นจริงๆ โดยมีคติอยู่ว่า

The more your tests resemble the way your software is used, the more confidence they can give you.

ยิ่ง test ของคุณทำงานคล้ายคลึงกับการใช้งานจริงมากเท่าไหร่ ความมั่นใจก็จะยิ่งเพิ่มมากขึ้นเท่านั้น

เริ่มติดตั้ง

สำหรับตัวอย่างการใช้ react-testing-library ในครั้งนี้ ผมจะเริ่มจากการ test กับ create-react-app จะได้เริ่มเขียน test กันเร็วขึ้น เพื่อไม่ให้เป็นการเสียเวลา เรามาเริ่มกันเลยดีกว่า

ก่อนอื่นเราก็มาสร้างโปรเจคด้วย create-react-app กันก่อน

npx create-react-app test-with-rtl
cd test-with-rtl
yarn start

เมื่อทุกอย่างเรียบร้อย เราก็จะเห็นว่ามันเปิดหน้าแรกของ create-react-app ที่คุ้นเคยขึ้นมาให้ทันที

ต่อมาก็ทำการติดตั้ง react-testing-library ด้วย yarn หรือ npm ก็แล้วแต่จะชอบ

yarn add react-testing-library --dev

เริ่มลงมือ

เมื่อลงกันครบแล้วก็มาเริ่มกันเลยดีกว่าครับ โดยเริ่มแรกให้เข้ามาที่ไฟล์ App.test.js แล้วทำการลบของเก่าออกให้หมด เพราะเราจะเริ่มเขียน test ด้วย react-testing-library กันแล้ว ซึ่งสิ่งแรกที่เราจะเริ่ม test กันก็คือ ดูว่ามีการแสดงผลของคำว่า “Learn React” บนหน้าเว็บถูกต้องหรือไม่ วิธีการเขียนก็ตามนี้

อันดับแรกเราจะเห็นว่ามีการ import { render, cleanup } from 'react-testing-library' ออกมา ซึ่ง render นั้นทำหน้าที่ในการ render ออกมาเป็น container และทำการเพิ่มเข้าไปใน document.body ส่วน cleanup เอาไว้สำหรับทำการ unmount container ที่ถูก render เอาไว้นั่นเอง

อย่างที่บอกไว้ข้างต้นว่าเราจะทำการ test ว่ามีการแสดงผลของคำว่า “Learn React” อยู่หรือไม่ เราสามารถเขียนได้โดยการใช้ getByText เพื่อทำการค้นหา element ทุกตัวที่ถูก render ออกมาว่ามี textContent ที่ตรงกับสิ่งที่เราต้องการค้นหาหรือเปล่า

ลองโยน props เพื่อทดสอบการเปลี่ยนแปลง

ต่อมาเรามาลองโยน props เข้าไปยัง App.js ของเรา เพื่อเปลี่ยนจากคำว่า “Learn React” เป็นคำอื่นแล้วลอง test ดูว่า component ของเราแสดงผลถูกต้องมั้ย

ก่อนอื่นก็ต้องทำให้ App.js ของเรารับ props เสียก่อน โดยเราจะส่ง props ที่มีชื่อว่า text เข้ามาเพื่อทำการเปลี่ยนคำที่จะแสดง แต่ว่าก็ยังมีค่าตั้งต้นเป็น “Learn React” อยู่

ต่อมาเราก็ต้องมาเพิ่มในไฟล์ App.test.js ของเราให้ทำการ render component พร้อมกับ props ใหม่ ซึ่งเราสามารถใช้งาน method rerender ได้หลังจากที่เราทำการ render component ไปแล้วหนึ่งครั้ง

สำหรับการลองเล่น react-testing-library ในตอนที่ 1 ก็ขอหยุดไว้ประมาณนี้ก่อน โดยตอนต่อๆ ไป ก็จะมีวิธีการใช้งาน react-testing-library แบบอื่นนอกจากแค่ getByText เพิ่มมากขึ้นเรื่อยๆ ยังไงก็รอติดตามตอนต่อไปด้วยนะครับ

Source code: https://github.com/rennerwins/test-with-rtl/tree/master

--

--