Почему мой тест Jest проходит, а затем вызывает функцию, создавая TypeError - PullRequest
0 голосов
/ 02 декабря 2018

Ссылка на репо на GitHub

Написание тестов с использованием Jest и при тестировании определенной функции, createDriversRecordsHash, я могу заставить тест пройти без проблем, но затем он возвращается сTypeError.Функция принимает в качестве аргумента строку драйверов, и единственная причина, по которой я вижу эту ошибку, заключается в том, что кто-то должен был вызвать функцию без передачи строки.

Здесь вы можете видеть, что тест проходит нормально, но послетесты завершают вызов функции createDriversRecordsHash, и она не может прочитать split из undefined, где undefined будет driverRecordsFileData (аргумент).Как я могу предотвратить это?

enter image description here

Если я поставлю return console.log(driverRecordsFileData) в начале функции, просто чтобы посмотреть, что driverRecordsFileDataтогда я получаю:

enter image description here

Тест

import { createDriversRecordsHash } from './main'

describe('Main.js', () => {
  test('createDriversRecordsHash', () => {
    let driverRecordsData = 'Driver Dan\n'
    driverRecordsData += 'Driver Alex\n'
    driverRecordsData += 'Driver Bob\n'
    driverRecordsData += 'Trip Dan 07:15 07:45 17.3\n'
    driverRecordsData += 'Trip Dan 06:12 06:32 21.8\n'
    driverRecordsData += 'Trip Alex 12:01 13:16 42.0'

    const hardCodedDriverRecordHash = {
      "Alex": {
          "__driverName": "Alex",
          "__milesPerHour": 34,
          "__totalDrivingDistInMiles": 42,
          "__totalDrivingTimeInHrs": 1.25,
        },
        "Bob": {
          "__driverName": "Bob",
          "__milesPerHour": 0,
          "__totalDrivingDistInMiles": 0,
          "__totalDrivingTimeInHrs": 0,
        },
        "Dan": {
          "__driverName": "Dan",
          "__milesPerHour": 47,
          "__totalDrivingDistInMiles": 39,
          "__totalDrivingTimeInHrs": 0.833333333333333,
        },
      }

    const driverRecordHash = createDriversRecordsHash(driverRecordsData)
    expect(driverRecordHash).toEqual(hardCodedDriverRecordHash)
  })
})

Тестируемая функция

export function createDriversRecordsHash(driverRecordsFileData) {
  return driverRecordsFileData.split('\n').reduce((acc, nxt) => {
    nxt = nxt.split(' ')
    const [command, driverName, ...rest] = nxt

    if (command === 'Driver') {
      acc[driverName] = new Driver(driverName)
    }
    else {
      let distInMiles = Math.round(Number(rest[2]))
      acc[driverName].setTotalDrivingDistInMiles(distInMiles)
      acc[driverName].setTotalDrivingTimeInHrs(rest)
      acc[driverName].setMilesPerHour()
    }

    return acc
  }, {})
}

1 Ответ

0 голосов
/ 02 декабря 2018

Думаю, проблема в том, что когда вы импортируете {createDriversRecordsHash} из './main', он запускает весь код в main.js как часть подготовки импорта.

getDriverRecords().then(data => console.log(data)) работает асинхронно, поскольку getDriverRecords возвращает обещание и использует асинхронную функцию fs.readFile.В этом сценарии вы не вызывали его через CLI, поэтому process.argv[2] не определено, а затем data не определено, а затем неопределенное значение передается в createDriversRecordsHash в строке 20, что затем генерирует ошибку.

Поскольку тест jest выполняется синхронно, он завершает прохождение теста, и ошибка выдается только после разрешения обещания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...