วิธีใช้ ESLint กับ Jest


254

ฉันพยายามใช้ linter ESLint กับกรอบการทดสอบ Jest

การทดสอบ Jest วิ่งด้วยกลมบางอย่างเช่นjestซึ่งฉันจะต้องบอกผู้ยืมเกี่ยวกับ แต่สิ่งที่ยุ่งยากคือโครงสร้างไดเรกทอรีโดย Jest การทดสอบจะถูกฝังด้วยซอร์สโค้ดใน__tests__โฟลเดอร์ดังนั้นโครงสร้างไดเรกทอรีจึงมีลักษณะดังนี้:

src
    foo
        foo.js
        __tests__
            fooTest.js
    bar
        bar.js
        __tests__
            barTest.js

โดยปกติแล้วฉันจะมีการทดสอบทั้งหมดของฉันภายใต้ dir เดียวและฉันสามารถเพิ่ม.eslintrcไฟล์ที่นั่นเพื่อเพิ่ม globals ... แต่แน่นอนฉันไม่ต้องการเพิ่ม.eslintrcไฟล์ใน__test__dir ทุกคน

สำหรับตอนนี้ฉันเพิ่งเพิ่ม globals ทดสอบลงใน.eslintrcไฟล์โกลบอลแต่เนื่องจากนั่นหมายความว่าตอนนี้ฉันสามารถอ้างอิงjestในโค้ดที่ไม่ใช่การทดสอบได้ซึ่งดูเหมือนว่าจะไม่เป็นทางออกที่ "ถูกต้อง"

มีวิธีรับ eslint ในการใช้กฎที่ยึดตามรูปแบบบางอย่างตามชื่อไดเรกทอรีหรืออะไรทำนองนั้น


1
นี้เป็นบิตกำลังดุร้ายเกินไปสำหรับคำตอบที่เกิดขึ้นจริง แต่คุณสามารถมีงาน linting แยกต่างหากที่ตนเองใช้eslint-testไฟล์กับ glob eslint **/__tests__/*.js -c eslint-test.ymlเช่น ที่กล่าวว่าฉันไม่คิดว่ามีอันตรายมากของjestหรือbeforeEachทั่วโลกรั่วไหลออกไปในรหัสการผลิต;)
นิค Tomlin

คำตอบ:


674

เอกสารที่แสดงว่าคุณสามารถเพิ่ม:

"env": {
    "jest": true
}

ของคุณ.eslintrcซึ่งจะเพิ่มสิ่งที่ตลกที่สุดที่เกี่ยวข้องกับสภาพแวดล้อมของคุณกำจัดข้อผิดพลาด / คำเตือน linter


27
ด้วยวิธีนี้การใช้ "อธิบาย" หรือ "มัน" นอกไฟล์ที่ตรงกับรูปแบบ " .test.js" หรือ "__tests __ / .js" จะไม่ส่งผลให้เกิดข้อผิดพลาดที่เป็นขุย มีวิธีใดบ้างที่จะบรรลุเป้าหมายนี้?
n1ru4l

7
@ l0rin คุณสามารถเพิ่ม.eslintrcไฟล์ที่ขยายคุณเริ่มต้น.eslintrcใน__tests__โฟลเดอร์ของคุณ หากคุณมีปัญหาเดียวกันกับ OP (โฟลเดอร์ทดสอบหลายโฟลเดอร์) คุณสามารถสร้างไฟล์เหล่านั้น.eslintrcด้วยเทมเพลตและสคริปต์ทุบตีเล็ก ๆ (เช่นls **/__tests/ | xargs cp templates/.eslintrc)
Ulysse BN

2
ลิงก์ที่เกี่ยวข้องที่นี่
devonj

73

ESLint สนับสนุนสิ่งนี้เป็นเวอร์ชัน> = 4:

/*
.eslintrc.js
*/
const ERROR = 2;
const WARN = 1;

module.exports = {
  extends: "eslint:recommended",
  env: {
    es6: true
  },
  overrides: [
    {
      files: [
        "**/*.test.js"
      ],
      env: {
        jest: true // now **/*.test.js files' env has both es6 *and* jest
      },
      // Can't extend in overrides: https://github.com/eslint/eslint/issues/8813
      // "extends": ["plugin:jest/recommended"]
      plugins: ["jest"],
      rules: {
        "jest/no-disabled-tests": "warn",
        "jest/no-focused-tests": "error",
        "jest/no-identical-title": "error",
        "jest/prefer-to-have-length": "warn",
        "jest/valid-expect": "error"
      }
    }
  ],
};

นี่คือวิธีแก้ปัญหา (จากคำตอบอื่นในที่นี่โหวตให้มัน!) สำหรับข้อ จำกัด "ขยายในการแทนที่" ของ eslint config:

overrides: [
  Object.assign(
    {
      files: [ '**/*.test.js' ],
      env: { jest: true },
      plugins: [ 'jest' ],
    },
    require('eslint-plugin-jest').configs.recommended
  )
]

จากhttps://github.com/eslint/eslint/issues/8813#issuecomment-320448724


4
ขอบคุณนี่เป็นคำตอบที่ถูกต้องสำหรับคำถามนี้ทั้งหมด ทำงานให้ฉัน!
สระ

1
มันเยี่ยมมาก! ด้วยการอัปเดต ESLint เป็นรุ่น> = 4 และการเพิ่ม a "files"และ"env"วัตถุเป็น"overrides"ในeslint.rcฉันไม่ต้องกังวลเกี่ยวกับไวยากรณ์เฉพาะของ Jest ที่ส่งผ่านการลอกคราบนอกไฟล์ทดสอบ
TheDarkIn1978

1
โซลูชันที่ยอดเยี่ยมและยังใช้งานได้กับเฟรมเวิร์กอื่น ๆ (จัสมิน) เมื่อคุณมีโครงสร้างโฟลเดอร์ที่ไม่ได้มาตรฐาน
Elliot Nelson

2
ฉันเป็นคนที่เขียนคำตอบที่ได้รับการยอมรับ - คำตอบนี้ดีกว่าของฉันมาก! แม้ว่าในขณะที่ฉันเขียนคำตอบของฉันมันเป็นวิธีเดียวที่จะแก้ปัญหานี้ได้ดี
Dave Cooper

6
ตอนนี้ ESLint สนับสนุนการขยายในการแทนที่
Nick McCurdy

21

คุณยังสามารถตั้งค่าการทดสอบ env ในไฟล์ทดสอบของคุณดังนี้:

/* eslint-env jest */

describe(() => {
  /* ... */
})

13

เพื่อให้คำตอบของ Zachary สำเร็จนี่เป็นวิธีแก้ปัญหาสำหรับข้อ จำกัด "การขยายในการแทนที่" ของ eslint config:

overrides: [
  Object.assign(
    {
      files: [ '**/*.test.js' ],
      env: { jest: true },
      plugins: [ 'jest' ],
    },
    require('eslint-plugin-jest').configs.recommended
  )
]

จากhttps://github.com/eslint/eslint/issues/8813#issuecomment-320448724


2

การกำหนดค่าตามรูปแบบกำหนดไว้สำหรับการปล่อย ESLint 2.0.0 อย่างไรก็ตามในตอนนี้คุณจะต้องสร้างสองงานแยกกัน (ดังที่ได้กล่าวไว้ในความคิดเห็น) หนึ่งชุดสำหรับการทดสอบและอีกชุดสำหรับรหัสที่เหลือและเรียกใช้ทั้งสองขณะที่ให้ไฟล์. eslintrc ที่แตกต่างกัน

ป.ล. มีสภาพแวดล้อมที่สนุกสนานในรุ่นถัดไปของ ESLint มันจะลงทะเบียนวงกลมที่จำเป็นทั้งหมด


2

ฉันแก้ไขปัญหาREF

วิ่ง

# For Yarn
yarn add eslint-plugin-jest -D

# For NPM
npm i eslint-plugin-jest -D

จากนั้นเพิ่ม.eslintrcไฟล์ของคุณ

{
    "extends": ["airbnb","plugin:jest/recommended"],
}

1

เพิ่มสภาพแวดล้อมเท่านั้น __tests__โฟลเดอร์

คุณสามารถเพิ่ม.eslintrc.ymlไฟล์ใน__tests__โฟลเดอร์ของคุณซึ่งขยายการกำหนดค่าพื้นฐาน:

extends: <relative_path to .eslintrc>
env:
    jest: true

หากคุณมีเพียงคนเดียว __tests__โฟลเดอร์ทางออกนี้ดีที่สุดเนื่องจากเป็นขอบเขตสภาพแวดล้อมที่ตลกที่สุดเท่าที่จำเป็น

การจัดการกับโฟลเดอร์ทดสอบมากมาย

หากคุณมีโฟลเดอร์ทดสอบเพิ่มเติม (ตัวพิมพ์เล็ก) ฉันยังคงแนะนำให้เพิ่มไฟล์เหล่านั้น และถ้าคุณมีโฟลเดอร์เหล่านั้นมากมายสามารถเพิ่มได้ด้วยสคริปต์ zsh:

#!/usr/bin/env zsh

for folder in **/__tests__/ ;do
    count=$(($(tr -cd '/' <<< $folder | wc -c)))
    echo $folder : $count
    cat <<EOF > $folder.eslintrc.yml
extends: $(printf '../%.0s' {1..$count}).eslintrc
env:
    jest: true
EOF
done

สคริปต์นี้จะค้นหา__tests__โฟลเดอร์และเพิ่ม.eslintrc.ymlไฟล์ที่มีการกำหนดค่าที่แสดงด้านบน .eslintrcสคริปต์นี้จะต้องมีการเปิดตัวที่อยู่ในโฟลเดอร์ที่มีผู้ปกครองของคุณ


1

คำตอบบางข้อสมมติว่าคุณติดตั้ง 'eslint-plugin-jest' แต่ไม่จำเป็นต้องทำเช่นนั้นคุณสามารถทำได้ใน.eslintrcไฟล์ของคุณเพิ่ม:

  "globals": {
    "jest": true,
  }

-8

ในไฟล์. eslintignore ของคุณเพิ่มค่าต่อไปนี้:

**/__tests__/

สิ่งนี้ควรละเว้นทุกกรณีของไดเรกทอรี __tests__ และลูก ๆ


4
นั่นไม่ใช่สิ่งที่ฉันต้องการฉันไม่ต้องการเพิกเฉยต่อไฟล์ทดสอบฉันยังต้องการขุยมันฉันแค่ต้องการหาวิธีระบุตัวเลือกที่จำเป็นเพื่อขุยมันอย่างถูกต้อง
Retsam

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