Аргумент типа .. не может быть назначен параметру типа .. в Typescript и модульном тесте - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь написать модульный тест для пользовательского метода, который я написал для Highcharts.

Для моего теста мне нужно создать объект Highcharts.Point для передачи в мой метод служебной программы.Вне теста объект Point создается автоматически при визуализации диаграммы, но для моего теста мне нужно создать пользовательский объект с моими собственными параметрами.

Мой пользовательский объект Point с именем PointObjectExtended является расширением Highcharts.Point , где dataLabel - это размеры меток значений в точке, а shapeArgs - это размеры.прямоугольника (в основном, индивидуальный график).

Это определения типов:

export interface PointObjectExtended extends Highcharts.PointObject {
  dataLabel: DataLabel
  shapeArgs: ShapeArguments
}

export interface DataLabel {
  width: number
  height: number
  hide (): void
}

export interface ShapeArguments {
  width: number
  height: number
}

В моем тесте у меня есть что-то из следующего:

    const point = {
      shapeArgs: { width: 20, height: 20 },
      dataLabel: { width: 20, height: 20, hide: jasmine.createSpy('hide spy') }
    }
    hide(point)
  })

И это реализация метода:

function hide (point: PointObjectExtended) {
  ..
  const shape = point.shapeArgs
  const label = point.dataLabel
  ..
}

Ошибка, которую я получаю при попытке передать мой point объект в hide(), заключается в следующем:

Argument of type '{ shapeArgs: { width: number; height: number; }; dataLabel: { width: number; height: number; hide...' is not assignable to parameter of type 'PointObjectExtended'.
  Property 'category' is missing in type '{ shapeArgs: { width: number; height: number; }; dataLabel: { width: number; height: number; hide...'.

Кажется, я хочу объявить остальную частьHighcharts.Point object.Я не думаю, что это правильный подход, но я не уверен, что еще я могу сделать.

Итак, мой вопрос - как мне создать PointObjectExtended, который я могу передать в мой метод модульного тестирования?

Одна альтернатива в том, что для моего метода я могу установить pointнаберите any, и он примет мой поддельный объект в тесте, но я не хочу использовать any, очевидно.

function hide (point: any) {
  ..
  const shape = point.shapeArgs
  const label = point.dataLabel
  ..
}

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вам нужно сделать две вещи: сначала объявить point как Partial.

. В тесте вы должны объявить Partial of PointObjectExtended, а затембросьте вход к нему.

  it('my nice test', function () {
    const point: Partial<PointObjectExtended> = {
      shapeArgs: { width: 20, height: 20 },
      dataLabel: { width: 26, height: 26 }
    }
    hide(point as PointObjectExtended)
    expect(hideSpy).toHaveBeenCalled()

  })
0 голосов
/ 05 июня 2018

Просто создайте новый интерфейс, который не расширяет точку старшей диаграммы:

export interface PointObjectExtension {
  dataLabel: DataLabel
  shapeArgs: ShapeArguments
}

type PointObjectExtended = Highcharts.PointObject & PointObjectExtension;

Так что вы можете просто сделать это в своей функции:

function hide(point: PointObjectExtension) {
  //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...