Как настроить Jest, добавленный в приложение через Vue cli 3? - PullRequest
3 голосов
/ 04 октября 2019

Я пытаюсь внедрить тестирование с помощью Jest в сборку приложения с помощью Vue. Я запустил

vue add unit-jest

и, аналогично тому, что тестирует отдельные файловые компоненты с помощью руководства Jest , создал следующий простой тестовый файл (Paginator.spec.js в той же папке, что и Paginator.vue, то есть /src/components):

import { mount } from '@vue/test-utils'
import Paginator from "./Paginator.vue";

describe('Paginator', () => {
    it('is a Vue instance', () => {
        const wrapper = mount(Paginator);
        // const a = 2;
        expect(wrapper.isVueInstance()).toBeTruthy();
        // expect(a).toBe(2);
    })
});

Изначально у меня возникла проблема с тем, что сам Jest не смог найти файл. Позже я изменил в jest.config.js

testMatch: [
  '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
],

на

testMatch: [
  '**/*.spec.(js|ts)|**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
],

, и после некоторых странных глюков он нашел файл (сделал git stash, убедился, чтоприложение работает, затем git stash pop и оно начало находить файлы).

Но у меня все еще есть проблема с тем, что Jest не распознает import. Я получаю следующие ошибки независимо от того, что я запускаю jest или npm test (то есть vue-cli-service test:unit). Простой тест, подобный этому, работает нормально:

describe('tests of components', () => {
    it('work', () => {
        const a = 2;
        expect(a).toBe(2);
    })
});

, но тест, показанный в начале вопроса, приносит

Набор тестов не удалось запустить
[...]

({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import { mount } from '@vue/test-utils'
                                                                                                ^
SyntaxError: Unexpected token {
  at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)

и если я переключу порядок импорта на

import Paginator from "./Paginator.vue";
import { mount } from '@vue/test-utils'

, я получу

● Test suite failed to run

  C:\NNTC\medkiosk\src\components\Paginator.spec.js:1
  ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Paginator from "./Paginator.vue";
                                                                                                  ^^^^^^^^^

  SyntaxError: Unexpected identifier

    at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)

(я не изменил jest.config. js любым способом, кроме расширения регулярного выражения, как показано выше)

В чем здесь проблема? Похоже, Jest не распознает import как языковую функцию ... это проблема неправильной конфигурации веб-пакета? Какой-то загрузчик отсутствует?

  • В проекте нет файла конфигурации webpack, потому что он был запущен с помощью vue cli. Один парень утверждает, что фактическая конфигурация в node_modules/@vue/cli-service/webpack.config.js, это не так уж и полезно:

    // this file is for cases where we need to access the
    // webpack config as a file when using CLI commands.
    
    let service = process.VUE_CLI_SERVICE
    
    if (!service || process.env.VUE_CLI_API_MODE) {
      const Service = require('./lib/Service')
      service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())
      service.init(process.env.VUE_CLI_MODE || process.env.NODE_ENV)
    }
    
    module.exports = service.resolveWebpackConfig()
    

    (resolWebpackConfig, кажется, этот )

  • Насколько я понимаю, настройка внутреннего веб-пакета выполнена внутри vue.config.js, но я не знаю, что это начальная конфигурация для начала изменения, а также то, что на самом деле следует настроить

  • Я пробовал npm i babel-jest (не уверен, установлен ли он уже vue cli), добавив .babelrc с { "presets": ["latest"] } аналогично тому, как у человека с аналогичная проблема сделал, попытался добавить в vue.config.js ту часть, которую предложил другой парень из этой ветки:

    configureWebpack: {
        module: {
            rules: [
                {
                    loader: "babel-loader",
                    options: {
                        presets: ["latest"]
                    }
                }
            ]
        }
    },
    

    , а также некоторые предложения из здесь и пока я вышелидей

  • ниже вы можете увидеть все файлы конфигурации

  • бонус: если я переименую Paginator.spec.js в Paginator.spec.ts заставляет Jest показать это вместо:

    ● Test suite failed to run
    
      Passing cached plugin instances is not supported in babel.loadPartialConfig()
    
        at forEach.item (node_modules/@babel/core/lib/config/partial.js:120:13)
            at Array.forEach (<anonymous>)
        at loadPartialConfig (node_modules/@babel/core/lib/config/partial.js:118:27)
        at TsJestTransformer.process (node_modules/ts-jest/dist/ts-jest-transformer.js:110:32)
    

Кто-нибудь может подсказать, как исправить конфиг? Или как его отладить? Из того, что я прочитал до сих пор, кажется, что Jest, вероятно, должен получить файл по конвейеру через babel-loader, что, похоже, не так, но я не уверен. Я знаю, я, вероятно, недостаточно знаю, как именно работает Webpack, так что подсказки, что нужно изучить, также приветствуются, я опубликую решение, когда найду его.

jest.config.js:

module.exports = {
  moduleFileExtensions: [
    'js',
    'jsx',
    'json',
    'vue',
    'ts',
    'tsx'
  ],
  transform: {
    '^.+\\.vue$': 'vue-jest',
    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
    '^.+\\.tsx?$': 'ts-jest'
  },
  transformIgnorePatterns: [
    '/node_modules/'
  ],
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1'
  },
  snapshotSerializers: [
    'jest-serializer-vue'
  ],
  testMatch: [
    '**/*.spec.(js|ts)|**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
  ],
  testURL: 'http://localhost/',
  watchPlugins: [
    'jest-watch-typeahead/filename',
    'jest-watch-typeahead/testname'
  ],
  globals: {
    'ts-jest': {
      babelConfig: true
    }
  }
};

babel.config.js:

module.exports = {
  presets: [
    '@vue/app'
  ]
}

vue.config.js:

module.exports = {
    // the default value is '/', which may be ok for production but is not suitable for local build/deploy
    publicPath: ''
};

часть package.json:

  "scripts": {
    "lint": "vue-cli-service lint",
    "serve": "vue-cli-service serve",
    "test:unit": "vue-cli-service test:unit",
    "build": "vue-cli-service build"
  },
  "dependencies": {
    "core-js": "^2.6.5",
    "vue": "^2.6.10",
    "vuex": "^3.1.1",
    "vue-class-component": "^7.0.2",
    "vue-property-decorator": "^8.2.2",
    "axios": "^0.19.0",
    // more packages
  },
  "devDependencies": {
    "@types/jest": "^23.1.4",
    "@vue/cli-plugin-babel": "^3.11.0",
    "@vue/cli-plugin-eslint": "^3.11.0",
    "@vue/cli-plugin-typescript": "^3.11.0",
    "@vue/cli-plugin-unit-jest": "^3.11.0",
    "@vue/cli-service": "^3.11.0",
    "@vue/eslint-config-typescript": "^4.0.0",
    "@vue/test-utils": "1.0.0-beta.29",
    "babel-core": "7.0.0-bridge.0",
    "babel-eslint": "^10.0.1",
    "eslint": "^5.16.0",
    "eslint-plugin-vue": "^5.0.0",
    "ts-jest": "^23.0.0",
    "typescript": "^3.4.3",
    "vue-template-compiler": "^2.6.10"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended",
      "@vue/typescript"
    ],
    "rules": {},
    "parserOptions": {
      "parser": "@typescript-eslint/parser"
    },
    "overrides": [
      {
        "files": [
          "**/__tests__/*.{j,t}s?(x)"
        ],
        "env": {
          "jest": true
        }
      }
    ]
  },
  "postcss": {
    "plugins": {
      "autoprefixer": {}
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}

tsconfig.json:

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "allowJs": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env",
      "jest"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...