Быстрое тестирование Oclif

Я пытаюсь написать модульный тест для хука 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 ответ

Решение

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

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') работал на меня

Другие вопросы по тегам