An example project for this setup is available on GitHub.
TypeScript is a popular superset of JavaScript that adds types and classes on top of regular JS. Vue Test Utils includes types in the distributed package, so it works well with TypeScript.
In this guide, we'll walk through how to setup a testing setup for a TypeScript project using Jest and Vue Test Utils from a basic Vue CLI TypeScript setup.
First you need to create a project. If you don't have Vue CLI installed, install it globally:
$ npm install -g @vue/cli-service-global
And create a project by running:
$ vue create hello-world
In the CLI prompt, choose to Manually select features
, select TypeScript, and press enter. This will create a project with TypeScript already configured.
::: tip NOTE If you want a more detailed guide on setting up Vue with TypeScript, checkout the TypeScript Vue starter guide. :::
The next step is to add Jest to the project.
Jest is a test runner developed by Facebook, aiming to deliver a battery-included unit testing solution. You can learn more about Jest on its official documentation.
Install Jest and Vue Test Utils:
$ npm install --save-dev jest @vue/test-utils
Next define a test:unit
script in package.json
.
// package.json
{
// ..
"scripts": {
// ..
"test:unit": "jest"
}
// ..
}
To teach Jest how to process *.vue
files, we need to install and configure the vue-jest
preprocessor:
npm install --save-dev vue-jest
Next, create a jest
block in package.json
:
{
// ...
"jest": {
"moduleFileExtensions": [
"js",
"ts",
"json",
// tell Jest to handle `*.vue` files
"vue"
],
"transform": {
// process `*.vue` files with `vue-jest`
".*\\.(vue)$": "vue-jest",
},
"testURL": "http://localhost/"
}
}
In order to use TypeScript files in tests, we need to set up Jest to compile TypeScript. For that we need to install ts-jest
:
$ npm install --save-dev ts-jest
Next, we need to tell Jest to process TypeScript test files with ts-jest
by adding an entry under jest.transform
in package.json
:
{
// ...
"jest": {
// ...
"transform": {
// ...
// process `*.ts` files with `ts-jest`
"^.+\\.tsx?$": "ts-jest"
},
// ...
}
}
By default, Jest will recursively pick up all files that have a .spec.js
or .test.js
extension in the entire project.
To run test files with a .ts
extension, we need to change the testRegex
in the config section in the package.json
file.
Add the following to the jest
field in package.json
:
{
// ...
"jest": {
// ...
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$"
}
}
Jest recommends creating a __tests__
directory right next to the code being tested, but feel free to structure your tests as you see fit. Just beware that Jest would create a __snapshots__
directory next to test files that performs snapshot testing.
Now we've got the project set up, it's time to write a unit test.
Create a src/components/__tests__/HelloWorld.spec.ts
file, and add the following code:
// src/components/__tests__/HelloWorld.spec.ts
import { shallowMount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'
describe('HelloWorld.vue', () => {
test('renders props.msg when passed', () => {
const msg = 'new message'
const wrapper = shallowMount(HelloWorld, {
propsData: { msg }
})
expect(wrapper.text()).toMatch(msg)
})
})
That's all we need to do to get TypeScript and Vue Test Utils working together!