คุณจะทดสอบการไม่มีอยู่ขององค์ประกอบโดยใช้ jest และ react-testing-library ได้อย่างไร?


102

ฉันมีไลบรารีคอมโพเนนต์ที่ฉันกำลังเขียนการทดสอบหน่วยสำหรับการใช้ Jest และ react-testing-library จากอุปกรณ์ประกอบฉากหรือเหตุการณ์บางอย่างฉันต้องการตรวจสอบว่าองค์ประกอบบางอย่างไม่ได้รับการแสดงผล

getByText, getByTestIdฯลฯ จากเส้นข้างและความผิดพลาดในreact-testing-libraryถ้าองค์ประกอบไม่พบสาเหตุที่ทำให้การทดสอบที่จะล้มเหลวก่อนที่จะexpectเกิดเพลิงไหม้ฟังก์ชั่น

คุณจะทดสอบสิ่งที่ไม่มีอยู่ใน jest โดยใช้ react-testing-library ได้อย่างไร?

คำตอบ:


216

จากDOM Testing-library Docs - Appearance and Disappearance

ไม่มีการยืนยันองค์ประกอบ

มาตรฐานgetByวิธีการโยนความผิดพลาดเมื่อพวกเขาไม่สามารถหาองค์ประกอบดังนั้นหากคุณต้องการที่จะให้การยืนยันว่าเป็นองค์ประกอบคือไม่ได้อยู่ใน DOM คุณสามารถใช้queryByAPIs แทน:

const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist

queryAllรุ่น APIs กลับอาร์เรย์ของโหนดจับคู่ ความยาวของอาร์เรย์มีประโยชน์สำหรับการยืนยันหลังจากเพิ่มหรือลบองค์ประกอบออกจาก DOM

const submitButtons = screen.queryAllByText('submit')
expect(submitButtons).toHaveLength(2) // expect 2 elements

not.toBeInTheDocument

jest-domห้องสมุดยูทิลิตี้ให้ .toBeInTheDocument()จับคู่ซึ่งสามารถใช้ในการยืนยันว่าเป็นองค์ประกอบอยู่ในเนื้อหาของเอกสารหรือไม่ สิ่งนี้มีความหมายมากกว่าการยืนยันผลลัพธ์ของคิวnullรี

import '@testing-library/jest-dom/extend-expect'
// use `queryBy` to avoid throwing an error with `getBy`
const submitButton = screen.queryByText('submit')
expect(submitButton).not.toBeInTheDocument()

4
kentcdodds ที่ไม่ดีของฉันขอบคุณ ฉันใช้getByTestIdและได้รับข้อผิดพลาดเดียวกัน และฉันไม่ได้ตรวจสอบคำถามที่พบบ่อยขออภัย ห้องสมุดที่ยอดเยี่ยม! คุณสามารถแก้ไขคำตอบของคุณเพื่อรวม ".toBeNull ();
SomethingOn

3
ฉันเชื่อว่าลิงก์ด้านบนมีจุดประสงค์เพื่อชี้ไปที่เอกสารไลบรารีการทดสอบปฏิกิริยา
pbre

2
ไซต์เอกสารใหม่ได้รับการเผยแพร่เมื่อไม่กี่วันที่ผ่านมา ฉันควรใช้ลิงก์ที่ถาวรกว่านี้ ขอบคุณสำหรับการอัปเดต @pbre!
kentcdodds

1
แหล่งข้อมูลที่มีประโยชน์อีกอย่าง: testing-library.com/docs/react-testing-library/cheatsheet
SomethingOn

6
และqueryByTextสำหรับผู้ที่ต้องการสิ่งที่เทียบเท่าgetByTextนั่นคือ null safe
S ..

24

ใช้queryBy/ queryAllBy.

อย่างที่คุณพูดgetBy*และgetAllBy*แสดงข้อผิดพลาดหากไม่พบสิ่งใด

อย่างไรก็ตามวิธีการที่เทียบเท่าqueryBy*และqueryAllBy*แทนที่จะส่งคืนnullหรือ[] :

แบบสอบถามโดย

queryBy* คิวรีส่งคืนโหนดที่ตรงกันแรกสำหรับคิวรีและส่งคืน nullหากไม่มีองค์ประกอบที่ตรงกัน สิ่งนี้มีประโยชน์สำหรับการยืนยันองค์ประกอบที่ไม่มีอยู่ สิ่งนี้จะแสดงหากพบรายการที่ตรงกันมากกว่าหนึ่งรายการ (ใช้ queryAllBy แทน)

queryAllBy*แบบสอบถามqueryAllByส่งคืนอาร์เรย์ของโหนดที่ตรงกันทั้งหมดสำหรับแบบสอบถามและส่งคืนอาร์เรย์ว่าง ([] ) หากไม่มีองค์ประกอบที่ตรงกัน

https://testing-library.com/docs/dom-testing-library/api-queries#queryby

ดังนั้นสำหรับสองข้อที่คุณกล่าวถึงคุณจะใช้แทนqueryByTextและqueryByTestIdแต่สิ่งเหล่านี้ใช้ได้กับข้อความค้นหาทั้งหมดไม่ใช่เฉพาะสองข้อนั้น


2
นี่เป็นวิธีที่ดีกว่าคำตอบที่ยอมรับ API นี้ใหม่กว่าหรือไม่
RubbelDieKatz

1
ขอบคุณสำหรับคำพูดที่ดี! นี่เป็นฟังก์ชันเดียวกับคำตอบที่ยอมรับดังนั้นฉันไม่คิดว่ามันเป็น API ที่ใหม่กว่า (แต่ฉันคิดผิด) ความแตกต่างที่แท้จริงเพียงอย่างเดียวระหว่างคำตอบนี้กับคำตอบที่ยอมรับคือคำตอบที่ยอมรับได้กล่าวว่ามีเพียงวิธีเดียวที่ทำสิ่งนี้ ( queryByTestId) เมื่อในความเป็นจริงมีสองชุดวิธีการทั้งหมดซึ่งqueryByTestIdเป็นตัวอย่างเฉพาะ
แซม

ขอบคุณฉันชอบสิ่งนี้มากกว่าการตั้งรหัสทดสอบ
Hylle

14

คุณต้องใช้ queryByTestId แทน getByTestId

นี่คือตัวอย่างโค้ดที่ฉันต้องการทดสอบว่าส่วนประกอบที่มีรหัส "รถยนต์" ไม่มีอยู่หรือไม่

 describe('And there is no car', () => {
  it('Should not display car mark', () => {
    const props = {
      ...defaultProps,
      base: null,
    }
    const { queryByTestId } = render(
      <IntlProvider locale="fr" messages={fr}>
        <CarContainer{...props} />
      </IntlProvider>,
    );
    expect(queryByTestId(/car/)).toBeNull();
  });
});

7

getBy * แสดงข้อผิดพลาดเมื่อไม่พบองค์ประกอบดังนั้นคุณสามารถตรวจสอบได้

expect(() => getByText('your text')).toThrow('Unable to find an element');

ซึ่งอาจเป็นข้อผิดพลาดได้ง่าย ข้อผิดพลาดถูกใช้เพื่อวัตถุประสงค์ในการดีบักและไม่ใช้สำหรับการตรวจสอบ
Milen Gardev

2

คุณสามารถใช้ react-native-testing-library "getAllByType" จากนั้นตรวจสอบว่าคอมโพเนนต์เป็นโมฆะหรือไม่ มีข้อได้เปรียบที่ไม่ต้องตั้งค่า TestID นอกจากนี้ควรทำงานร่วมกับส่วนประกอบของบุคคลที่สาม

 it('should contain Customer component', () => {
    const component = render(<Details/>);
    const customerComponent = component.getAllByType(Customer);
    expect(customerComponent).not.toBeNull();
  });

ประเภทนี้ละเมิดหลักฐานที่ไม่มีรายละเอียดการใช้งาน (เช่นชื่อส่วนประกอบ) ในการทดสอบ
RubbelDieKatz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.