React Test – How to write Unit test and e2e test (1)?

Unit test

Setup

  • Install ts-jest for testing TypeScript files
yarn add --dev jest typescript
yarn add --dev ts-jest @types/jest
yarn ts-jest config:init
  • Run yarn test or yarn jest

Test

/* eslint-disable no-undef */
const { getMeetCode } = require('src/pages/Home/format')

test('retrieve a teacher', () => {
  const mock = [
    {
      id: '5168779',
      isStudent: true,
      isTeacher: false,
    },
    {
      id: '5198724',
      isStudent: false,
      isTeacher: true,
    },
  ]
  expect(getMeetCode(mock)).toBe('5198724')
})

Problems

How to ignore a specific file type “e2e.test.js”?

Edit package.json file

"test": "jest --testPathIgnorePatterns=.*e2e.test.js",

e2e test

Use puppeteer and jest-puppeteer

Setup

  • Install packages
yarn add puppeteer jest-puppeteer --dev
yarn add @types/puppeteer @types/jest-environment-puppeteer @types/expect-puppeteer --dev
  • Edit jest.config.js
/* eslint-disable no-undef */
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
const ts_preset = require('ts-jest/jest-preset')
const puppeteer_preset = require('jest-puppeteer/jest-preset')

module.exports = {
  ...ts_preset,
  ...puppeteer_preset,
  globals: {
    URL: 'http://localhost:3004',
  },
}
  • Create jest-puppeteer.config.js (Optional)
module.exports = {
  launch: {
    headless: process.env.HEADLESS !== 'false',
    slowMo: process.env.SLOWMO ? process.env.SLOWMO : 0,
    devtools: true,
  },
}
  • Edit package.json
"test:e2e": "jest --testPathPattern=.*e2e.test.js$",

Test

// testPage.e2e.test.js

/* eslint-disable no-undef */
const puppeteer = require('puppeteer')
...

const mockURL =
  'http://localhost:3004/xxxx'

describe('Check something...', () => {
  let browser
  let page

  beforeAll(async () => {
    browser = await puppeteer.launch({
      headless: false,
    })
    page = await browser.newPage()
    await page.setViewport({ width: 1366, height: 768 })
    await page.goto(mockURL)
  }, 30000) // timeout 30s

  ///////////////
  // Body
  it('Should display data table', async () => {
    await testDataTable(page)
  })

  // End
  afterAll(() => browser.close())
})


// testDataTable.js

/* eslint-disable no-undef */
const { isVisible } = require('./utils/utils')

const testDataTable = async (page) => {
  const isDisplayed = await isVisible(
    page,
    '//div[@id="id-data-table"]'
  )
  if (!isDisplayed) {
    await takeScreenshot(page, 'ErrorDataTable')
    throw 'Data table not found'
  }
}

exports.testDataTable = testDataTable
// utils.js

const takeScreenshot = async (page, fileName) => {
  await page.screenshot({
    path: `./__test___/end2end/screenshots/${fileName}.png`,
    fullPage: true, // take a full page screenshot
  })
}

const isVisible = async (page, xPathSelector) => {
  try {
    await page.waitForXPath(xPathSelector, { visible: true, timeout: 2000 })
    return true
  } catch {
    return false
  }
}

exports.isVisible = isVisible
exports.takeScreenshot = takeScreenshot

For more in detail with puppeteer, please refer

XPath

  • Locate node with specific attribute
//div[@id="top-list"]/div[@data-list]

or

//div[@id="top-list"]/div[@data-list="1"]

Be the first to comment

Leave a Reply

Your email address will not be published.


*