166

I'm doing some slightly bizarre stuff using Jest for testing where I'm writing some stuff to disk. If I use the watch flag in Jest however then I'm finding (quite obviously) that each time I write something to disk the tests refire again.

I don't currently have any sort of configuration, and I've taken a look at the documentation, but it's really not clear to me which option I need to be using to suppress watching particular files. I believe I can see options to exclude code from code-coverage and test execution, but not the actual watcher.

In my case I've got a setup like this and I just want to suppress my results directory:

  • __tests__
  • __snapshots__ (created by Jest)
  • results (created by me and the directory to exclude)
  • testfile1.js

How can I do this?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ian
  • 33,605
  • 26
  • 118
  • 198

13 Answers13

230

From the documentation you need to add modulePathIgnorePatterns which is an array of string values which will be matched against

modulePathIgnorePatterns [array<string>] #

(default: []) An array of regexp pattern strings that are matched against all module paths before those paths are to be considered 'visible' to the module loader. If a given module's path matches any of the patterns, it will not be require()-able in the test environment. These pattern strings match against the full path. Use the <rootDir> string token to include the path to your project's root directory to prevent it from accidentally ignoring all of your files in different environments that may have different root directories. Example: ['<rootDir>/build/'].

https://facebook.github.io/jest/docs/configuration.html#modulepathignorepatterns-array-string

Add this to your configuration...

modulePathIgnorePatterns: ["directoryNameToIgnore"]

or:

modulePathIgnorePatterns: ["<rootDir>/dist/"]
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Chris Hawkes
  • 11,923
  • 6
  • 58
  • 68
  • 11
    I've given this a try with `"jest": { "modulePathIgnorePatterns": ["__tests__/results/"] },` but it doesn't work unfortunately. – Ian Nov 08 '16 at 13:22
  • 1
    can you try shortening it? "jest": { "modulePathIgnorePatterns": ["__tests__"] }, – Chris Hawkes Nov 08 '16 at 13:27
  • `__tests__` is the default directory that `jest` uses to load its tests from. So it'd be awkward to rename, I could move my `results` directory up outside of `__tests__` but I'm reluctant to do so unless I can't find an alternative. – Ian Nov 08 '16 at 13:28
  • 1
    yes you're probably right, I'm just wondering if the pathName is somehow choking due to the slashes. In most cases when I'm using exclude directories in webpack I don't include the forward slashes and just the names of the directories like "node_module" etc... – Chris Hawkes Nov 08 '16 at 13:29
  • true. I've just tried moving the directory up, didn't seem to make any difference. I have worked out it's specifically a JSON file within there that I'm modifying that's causing the problem. Trying to just exclude that still doesn't seem to do much though :( – Ian Nov 08 '16 at 13:32
  • 1
    In what file? *package.json*? Can you add it to your answer? – Peter Mortensen Dec 29 '20 at 22:35
  • I just want to make sure: Does Jest automatically ignore checking the node_modules directory? (Most probably it must be the case!) – aderchox Dec 16 '21 at 17:15
84

To exclude a directory from Jest testing, use testPathIgnorePatterns

testPathIgnorePatterns

"testPathIgnorePatterns": ["directory to ignore"]

Below in file package.json, I have configured to ignore the "src" directory

{
      "name": "learn-test",
      "jest": {
        "testPathIgnorePatterns": ["src"]
      },
      "version": "0.1.0",
      "private": true,
      "dependencies": {
        "react": "^16.4.1",
        "react-dom": "^16.4.1",
        "react-scripts": "1.1.4"
      },
      "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "jest --watch",
        "eject": "react-scripts eject",

      },

      "devDependencies": {}
    }
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
manas
  • 6,119
  • 10
  • 45
  • 56
18

I had the same problem when I had a directory that must not be tested, although I still wanted it to be inside of the __tests__ directory (e.g., __mocks__).

You should not use a use relative paths in such case (no slashes). So inside of your package.json file add:

jest: {
  "modulePathIgnorePatterns": ["__mocks__"]
}

That solved my problem.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Islam Murtazaev
  • 1,488
  • 2
  • 17
  • 27
  • 1
    Best answer so far... BUT, [create-react-app](https://create-react-app.dev) and derived boilerplates won't support that option. I used [watchPathIgnorePatterns](https://jestjs.io/docs/en/configuration#watchpathignorepatterns-array-string) instead. Just put it in your package.json's jest prop: `"jest": {"watchPathIgnorePatterns":["__mocks__"]}` – Malek Boubakri Aug 03 '22 at 18:43
13

Based on Jest documentation, watchPathIgnorePatterns should be the way you want to go. That works in Jest 23.x.x and later.

You can add this config to jest.config.js or package.json > jest

Nima Soroush
  • 12,242
  • 4
  • 52
  • 53
  • helped with me with vs-code tests doing all sorts of magic and failing. Also had to change `"jest.jestCommandLine": "npm run test:jest --"` in the vs code extension options – David Apr 13 '23 at 11:38
8

jest version: 27.2.1

In order to exclude from test and coverage:

"testPathIgnorePatterns" : [
  "tests/login/default/MockStrategy.js",
],
coveragePathIgnorePatterns: [
  "tests/login/default/MockStrategy.js"
],
JRichardsz
  • 14,356
  • 6
  • 59
  • 94
7

I use the following pattern and it works for me:

collectCoverageFrom: [
    'src/**/*.js',
    '!src/api/graphql/**/*.js',
    '!src/action/**/*.js',
    '!src/utils/dev/*.js',
    '!src/**/*.e2e.js',
],

! means we exclude the folder or file.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Faris Rayhan
  • 4,500
  • 1
  • 22
  • 19
6

To exclude an entire folder, add the following in the "jest" property of the package.json file:

"modulePathIgnorePatterns": [
  "<rootDir>/src/services"
],

To exclude an individual file:

"collectCoverageFrom": [
  "!src/index.js"
],
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
yasarui
  • 6,209
  • 8
  • 41
  • 75
  • 1
    Thanks, Working Added regular expression sample "collectCoverageFrom": [ "src/**/*.{ts,js}", "!src/db_access/*.{ts,js}", "!src/**/__fixtures/.{ts,js,json}", "!src/**/__removed__/.{ts,js,json}", "!src/models/.{ts,js,json}" ] – Abhijith v Mar 30 '21 at 10:56
3

In most of cases you will get the error: Your test suite must contain at least one test.

To ignore/exclude file or folders from the test, please modify the package.json

If the block "jest" does not exist add it like that:

...
"jest": {
    "collectCoverage": true,
    "testPathIgnorePatterns" : [
      "__tests__/properties.js",
      "__tests__/properties.js.sample"
    ]
},
...
Yuriy
  • 69
  • 2
  • 1
    It actually works quite well. I prefer this cause I dont need to add folders. One thing I notice you have to restart the 'watch' for it to take effect. – Álvaro Sep 23 '21 at 04:16
3

I was looking for the command-line way of doing this without editing the config file everytime I try changing things.

This following runs jest in watch mode but excludes end-to-end test folders, independent from npm. you may have it in scripts section but if you do so then do not forget to remove "npx".

npx jest --watchAll --testPathIgnorePatterns "e2e_a/" "e2e_b/"

PS: some tests, especially E2E ones, may need to be run sequentially with -i, --runInBand flag. This comes in useful to exclude them from watch mode provided that they have their own folders. So prefer to have them in separate folders.

Yılmaz Durmaz
  • 2,374
  • 12
  • 26
2

here are my 2 cents on this, as I feel there is some confusion in above answers:

Following is the jest segment in package.json file :

"jest": {
"testPathIgnorePatterns": ["wallet-svc/src/db/"],
"coveragePathIgnorePatterns": ["wallet-svc/src/db/"],
"modulePathIgnorePatterns": ["wallet-svc/src/db/"],
"moduleFileExtensions": [
  "js",
  "json",
  "ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
  "^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
  "**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}

If you notice I have mentioned 3 ignores - "testPathIgnorePatterns", "coveragePathIgnorePatterns" and "modulePathIgnorePatterns". It so happens at time when you are running tests, the files are ignored but when you run the coverage, jest does not ignore those file and you see them in the coverage report. Better to include all 3 tags.

I found this thread helpful : https://github.com/facebook/jest/issues/1815#issuecomment-684882428

Harshil
  • 1,230
  • 17
  • 22
1

I had a similar situation, and adding testRegex in the jest.config.js was the complete solution for me, which specify which files exactly to be tested!

testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$'
Solly
  • 496
  • 1
  • 6
  • 14
0

Skipping files in the test cases report collection is possible using "collectCoverageFrom" in the latest version of create-react-app, jest:

"jest": {
    "collectCoverageFrom": [
        "src/**/*.{js,jsx,ts,tsx}",
        "!<rootDir>/src/registerServiceWorker.js",
        "!<rootDir>/src/serviceWorker.js",
        "!<rootDir>/node_modules/"
    ]
},
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
0

I used this config in my package.json to exclude index.js and reportWebVitals.js files from coverage report.

  "jest": {
    "collectCoverageFrom": [
      "!<rootDir>/src/reportWebVitals.js",
      "!<rootDir>/src/index.js"
    ],
  }
coderpc
  • 4,119
  • 6
  • 51
  • 93