ทำการทดสอบเพียงครั้งเดียวกับ Jest


95

ง่ายมากฉันต้องการเรียกใช้การทดสอบกับ Jest เพียงครั้งเดียว

ฉันใส่it.onlyหรือdescribe.onlyแต่มันยังคงดำเนินการทดสอบมากมาย ฉันคิดว่ามันเรียกใช้การทดสอบทั้งหมดตั้งแต่การกระทำครั้งสุดท้ายของฉัน แต่มันไม่ควรมีพฤติกรรมเช่นนี้เมื่อonlyตั้งค่าสถานะไว้อย่างชัดเจนใช่ไหม

อะไรเป็นสาเหตุของพฤติกรรมนี้และจะเรียกใช้การทดสอบเดี่ยวได้อย่างไร



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

@jpenna: เพียงแค่ดูคำถามเดิม ก็ได้รับคำตอบเหมือนกัน
Dan Dascalescu

คำตอบ:


122

Jest ดำเนินการทดสอบแบบขนานและไม่ทราบล่วงหน้าว่าการทดสอบใดควรรันและไม่ควรรัน ซึ่งหมายความว่าเมื่อคุณใช้ "พอดี" ก็จะเรียกใช้การทดสอบหนึ่งในแฟ้มที่ แต่ยังคงเรียกใช้ไฟล์ทดสอบอื่น ๆ ทั้งหมดในโครงการของคุณ

fit, fdescribeและit.only, describe.onlyมีจุดประสงค์เดียวกันข้ามการทดสอบอื่น ๆ เรียกฉันเท่านั้น

ที่มา: https://github.com/facebook/jest/issues/698#issuecomment-177673281


ใช้jestกลไกการกรองเมื่อคุณเรียกใช้การทดสอบเช่น

jest --config=jest.config.json --watch

คุณสามารถกรองการทดสอบตามtestnameหรือfilenameเพียงทำตามคำแนะนำในเทอร์มินัล

ป้อนคำอธิบายภาพที่นี่

กดpแล้วพิมพ์ชื่อไฟล์

ป้อนคำอธิบายภาพที่นี่

จากนั้นคุณสามารถใช้describe.onlyและit.onlyจะข้ามการทดสอบอื่น ๆ ทั้งหมดจากไฟล์ที่กรองและทดสอบแล้ว


1
ฉันกำลังทำตัวกรองนี้ทีละไฟล์ แต่มันแปลก ... ดังนั้นจึง.onlyใช้ได้กับการทดสอบไฟล์เดียวกันเท่านั้น?
jpenna

2
ฉันชอบสิ่งนั้นมากยิ่งขึ้นมีเพียงสิ่งเดียวที่ฉันเคยลืมเลิกทำเฉพาะในซอร์สโค้ดและยอมรับสิ่งนั้น
Dziamid

3
แม้ว่าการทดสอบจะข้ามไป แต่ก็ยังดูเหมือนว่าจะประเมินโค้ดภายใต้การทดสอบในแต่ละตัวอย่าง ไม่มีวิธีเดียวในการทดสอบเพียงครั้งเดียวในปี 2019 หรือไม่?
อาดัม

@adaam ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณถูกต้องหรือไม่ดังนั้นโปรดแก้ไขฉันหากฉันผิด หากการทดสอบอยู่ในไฟล์แยกกันระบบจะดำเนินการเฉพาะโค้ดในไฟล์เฉพาะเมื่อคุณใช้รูปแบบเพื่อรันการทดสอบอย่างชัดเจน เมื่อมีการเรียกใช้โค้ดสำหรับไฟล์เฉพาะโค้ดทั้งหมดในไฟล์นั้นจะถูกแยกวิเคราะห์ดังนั้นแม้ว่าคุณจะใช้it.onlyหรือit.skipสำหรับการทดสอบเดียวที่มีข้อผิดพลาดทางไวยากรณ์การทดสอบทั้งหมดจะล้มเหลว แน่นอนรหัสจากไฟล์ที่แยกตามรูปแบบจะไม่ถูกเรียกใช้ imgur.com/z9FlQEZ
Dawid Karabin

@hinok ติด console.log ในส่วนประกอบ Carousel ของคุณและเรียกใช้นักวิ่งทดสอบของคุณอีกครั้ง สำหรับฉันแม้ว่าฉันif.onlyจะใช้console.logs จากส่วนประกอบ Carousel หลาย ๆ ครั้งเนื่องจากมีการทดสอบส่วนประกอบนั้นที่ข้าม / ไม่ได้ข้ามมาในรูปแบบนาฬิกาของคุณ
adaam

29

it.onlyและใช้describe.onlyงานได้กับโมดูลที่อยู่ในโมดูลเท่านั้นหากคุณประสบปัญหาในการกรองการทดสอบในหลายไฟล์คุณสามารถใช้jest -t name-of-specกรองการทดสอบที่ตรงกับชื่อข้อมูลจำเพาะ (ตรงกับชื่อในการอธิบายหรือทดสอบ)
ที่มา: https://facebook.github.io/jest/docs/en/cli.html

ตัวอย่างเช่นฉันมุ่งเน้นไปที่การทดสอบที่ฉันกำลังเขียนเช่นนี้ (โดยมีสคริปต์ทดสอบในpackage.json):
npm test -- -t "test foo"


4
สิ่งนี้ยังคงใช้การทดสอบทุกครั้งในกรณีของฉันและฉันไม่รู้ว่าทำไม
Kenny

คำอธิบายเดียวที่ฉันคิดได้คือคุณกำลังส่งอาร์กิวเมนต์สตริงที่มีอยู่ในทุกชื่อการทดสอบ (หรือdescribeบล็อกการทดสอบ) หากเป็นเช่นนั้นคุณควร จำกัด ชื่อการทดสอบที่คุณต้องการโฟกัสให้แคบลง
rodgobbi

คำตอบนี้ดูจะเหมาะกับคำถามอื่นมากกว่า: stackoverflow.com/questions/42827054/…
千木

8

มันเป็นแบบนี้:

jest sometest.test.js -t "some expression to match a describe or a test"

มันจะทดสอบไฟล์ทั้งหมดที่มีชื่อsometest.test.jsและการจับคู่ตามตัวเลือก -t หากคุณต้องการทดสอบไฟล์เฉพาะคุณสามารถทำได้:

jest src/user/.../sometest.test.js

สำหรับผู้ที่ต้องการใช้ตัวเลือกนี้ในlaunch.jsonไฟล์กำหนดค่า VSCode ที่จะเรียกใช้การทดสอบในกรณีทดสอบเฉพาะ: medium.com/better-programming/…
Gus

8

สำหรับฉันมันใช้งานได้ถ้าฉันใช้ 2 พารามิเตอร์แบบนี้:

yarn test --watch -f "src/...fullpath.../reducer.spec.js" -t "Name of the test"

ธง:

--watch: is optional

-f: will do filtering of your files, so if you have a lot of tests with the same name, specify the full path to the exact file

-t: works with 'describe' name or 'it' name of your test
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.