Cách sử dụng ESLint với Jest


253

Tôi đang cố gắng sử dụng trình giả lập ESLint với khung thử nghiệm Jest.

Các bài kiểm tra Jest chạy với một số toàn cầu như jest, mà tôi sẽ cần nói với người nói dối về; nhưng điều khó khăn là cấu trúc thư mục, với Jest, các bài kiểm tra được nhúng với mã nguồn trong __tests__các thư mục, do đó cấu trúc thư mục trông giống như:

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

Thông thường, tôi có tất cả các bài kiểm tra của mình trong một thư mục duy nhất và tôi chỉ có thể thêm một .eslintrctệp ở đó để thêm toàn cầu ... nhưng tôi chắc chắn không muốn thêm một .eslintrctệp vào mỗi __test__thư mục.

Hiện tại, tôi vừa mới thêm toàn cầu thử nghiệm vào .eslintrctệp toàn cầu , nhưng vì điều đó có nghĩa là bây giờ tôi có thể tham chiếu jesttrong mã không thử nghiệm, nên dường như đó không phải là giải pháp "đúng".

Có cách nào để eslint áp dụng các quy tắc dựa trên một số mẫu dựa trên tên thư mục, hoặc một cái gì đó tương tự không?


1
Đây là một chút quá mạnh mẽ cho một câu trả lời thực tế, nhưng bạn có thể có một nhiệm vụ linting riêng biệt sử dụng thủ công một eslint-testtệp với một quả cầu, ví dụ eslint **/__tests__/*.js -c eslint-test.yml. Điều đó nói rằng, tôi không nghĩ rằng có nhiều nguy cơ bị một jesthoặc beforeEachtoàn cầu bị rò rỉ ra ngoài vào mã sản xuất;)
Nick Tomlin

Câu trả lời:


670

Các tài liệu cho thấy bạn hiện có thể thêm:

"env": {
    "jest": true
}

Để bạn .eslintrcsẽ thêm tất cả những thứ liên quan đến trò đùa vào môi trường của bạn, loại bỏ các lỗi / cảnh báo kẻ nói dối.


27
Với phương pháp này, việc sử dụng "mô tả" hoặc "nó" bên ngoài các tệp khớp với mẫu " .test.js" hoặc "__tests __ / .js" sẽ không dẫn đến lỗi linting. Có bất kì cách nào để đạt được điều này không?
n1ru4l

7
@ l0rin bạn có thể thêm một .eslintrctệp mở rộng mặc định .eslintrctrong __tests__thư mục của bạn . Nếu bạn gặp vấn đề tương tự như OP (nhiều thư mục thử nghiệm), thì bạn có thể tạo chúng .eslintrcvới một mẫu và tập lệnh bash nhỏ (đại loại như ls **/__tests/ | xargs cp templates/.eslintrc)
Ulysse BN

2
liên kết liên quan ở đây
devonj

73

ESLint hỗ trợ điều này kể từ phiên bản> = 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"
      }
    }
  ],
};

Đây là một cách giải quyết (từ một câu trả lời khác ở đây, bỏ phiếu!) Cho giới hạn "mở rộng ghi đè" của cấu hình eslint:

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

Từ https://github.com/eslint/eslint/issues/8813#issuecomment-320448724


4
Cảm ơn bạn, đây hoàn toàn là giải pháp phù hợp cho câu hỏi này, vì nó thực sự trả lời nó. đã làm cho tôi!
sra

1
Điều đó thật tuyệt! Với việc cập nhật ESLint của tôi lên phiên bản> = 4 và thêm một "files""env"đối tượng vào "overrides"trong, eslint.rctôi không còn phải lo lắng về cú pháp cụ thể của Jest chuyển qua bên ngoài các tệp thử nghiệm.
TheDarkIn1978

1
Giải pháp tuyệt vời và cũng hoạt động cho các khung khác (hoa nhài) khi bạn có cấu trúc thư mục không chuẩn.
Elliot Nelson

2
Tôi là người đã viết câu trả lời được chấp nhận - câu trả lời này tốt hơn tôi nhiều! Mặc dù tại thời điểm tôi viết câu trả lời của mình, đó là cách duy nhất để giải quyết vấn đề này tốt.
Dave Cooper

6
ESLint hiện hỗ trợ mở rộng phần ghi đè
Nick McCurdy

21

Bạn cũng có thể đặt env thử nghiệm trong tệp thử nghiệm của mình như sau:

/* eslint-env jest */

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


2

Các cấu hình dựa trên mẫu được lên lịch để phát hành phiên bản 2.0.0 của ESLint. Tuy nhiên, bây giờ, bạn sẽ phải tạo hai nhiệm vụ riêng biệt (như đã đề cập trong các bình luận). Một cho các thử nghiệm và một cho phần còn lại của mã và chạy cả hai, trong khi cung cấp các tệp .eslintrc khác nhau.

PS Có một môi trường vui nhộn sắp tới trong phiên bản tiếp theo của ESLint, nó sẽ đăng ký tất cả các toàn cầu cần thiết.


2

Tôi đã giải quyết vấn đề REF

Chạy

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

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

Và sau đó thêm vào .eslintrctập tin của bạn

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

1

Chỉ thêm môi trường cho __tests__thư mục

Bạn có thể thêm một .eslintrc.ymltệp trong các __tests__thư mục của mình , giúp bạn mở rộng cấu hình cơ bản:

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

Nếu bạn chỉ có một __tests__thư mục, giải pháp này là tốt nhất vì nó phạm vi môi trường chỉ dành cho những nơi cần thiết.

Xử lý nhiều thư mục kiểm tra

Nếu bạn có nhiều thư mục kiểm tra (trường hợp OP), tôi vẫn đề nghị thêm các tệp đó. Và nếu bạn có hàng tấn các thư mục đó, có thể thêm chúng bằng một tập lệnh zsh đơn giản:

#!/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

Kịch bản lệnh này sẽ tìm các __tests__thư mục và thêm một .eslintrc.ymltệp vào cấu hình hiển thị ở trên. Kịch bản này phải được khởi chạy trong thư mục chứa cha mẹ của bạn .eslintrc.


1

Một số câu trả lời cho rằng bạn đã cài đặt 'eslint-plugin-jest', tuy nhiên không cần phải làm điều đó, bạn chỉ cần làm điều này trong .eslintrctệp của mình , thêm:

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

-8

Trong tệp .eslintignore của bạn thêm giá trị sau:

**/__tests__/

Điều này sẽ bỏ qua tất cả các trường hợp của thư mục __tests__ và con cái của họ.


4
Đó không hoàn toàn là những gì tôi muốn, tôi không muốn bỏ qua các tệp thử nghiệm, tôi vẫn muốn lint chúng, tôi chỉ muốn tìm ra cách chỉ định các tùy chọn cần thiết để lint chúng một cách chính xác.
Retsam

2
Ý tưởng rất tệ, eslint giúp trong tất cả các mã - bao gồm cả mã kiểm tra.
Daniel Kmak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.