Быстрое тестирование Oclif - PullRequest
2 голосов
/ 27 июня 2019

Я пытаюсь написать модульный тест для хука Oclif, который содержит простое приглашение.Я хочу проверить вывод хука, получив ответ «Y» или «N» на приглашение.

import {Hook} from '@oclif/config'
import cli from 'cli-ux'

const hook: Hook<'init'> = async function () {

  const answer = await cli.prompt("Y or N?")

  if(answer === 'Y') {
    this.log('yes')
  }
  else {
    this.log('no')
  }
}

export default hook

Я использую тестовые фреймворки 'fancy-test' и 'oclif / test', описанные здесь: https://oclif.io/docs/testing

Я попробовал заглушитьподсказка и имитация стандартного ввода, но ни одна из них не работает - либо функция-заглушка недоступна, либо вывод представляет собой пустую строку.

Вот попытка одного теста (не работает, потому что «cli.prompt не являетсяфункция '):

import {expect, test} from '@oclif/test'
import cli from 'cli-ux'
import * as sinon from 'sinon';

describe('it should test the "configure telemetry" hook', () => {
  test
  .stub(cli, 'prompt', sinon.stub().resolves('Y'))
  .stdout()
  .hook('init')
  .do(output => expect(output.stdout).to.contain('yes'))
  .it()
})

Мне пришло в голову, что я, вероятно, неправильно структурирую свой тест.Если кто-то может указать мне правильное направление или предоставить какой-нибудь псевдо / пример кода о том, как подойти к тестированию вышеописанного хука, это было бы удивительно - спасибо!

1 Ответ

2 голосов
/ 01 июля 2019

Вы пробовали с:

import {expect, test} from '@oclif/test'
import cli from 'cli-ux'
import * as sinon from 'sinon';

describe('it should test the "configure telemetry" hook', () => {
  test
  .stub(cli, 'prompt', () => async () => 'Y')
  .stdout()
  .hook('init')
  .do(output => expect(output.stdout).to.contain('yes'))
  .it()
})

Заглушка с .stub(cli, 'prompt', () => async () => 'Y') работал для меня

...