Jest проверить решение отклонить обратный вызов - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть эта функция, которая вызывает функцию util для вызовов API.Функция util разрешает или отклоняет на основе результата API.

Теперь мне нужно выполнить модульное тестирование функций обратного вызова, которые имеют следующую структуру.

`theClassMethod : () => {
    return utilMethod().then(
    result => { this.functionOne() //Test this function is called }, 
    error => { this.functionTwo() //Test this function is called }
    )
}`

Метод util возвращает обещание, подобноениже:

utilFunc = (data :string) :Promise<ResultData[]> => {
    return new Promise(async (resolve, reject) => {
        try{
            resolve(data)
        }catch{
            reject(error)
        }
    }) 
}

https://codesandbox.io/s/vjnwy1zw75?fontsize=14

То, что я пробовал:

  1. Насмешил метод util для разрешения / отклонения.Вызовите метод класса и сделайте утверждения.Это не работает, и тест всегда проходит как ложное срабатывание.

Я потратил много времени на поиск аналогичной проблемы.Большинство вопросов здесь, чтобы проверить код как:

theClassMethod : () => { utilMethod.then().catch()}

Проблема, которую я пытаюсь решить, состоит в том, чтобы проверить разрешение, отклонить обратные вызовы в блоке thenthen(function1, function2).Что кодовый блок внутри функции 1 должен быть проверен, чтобы он вызывал некоторые предназначенные функции.

1 Ответ

3 голосов
/ 26 апреля 2019

Подход, который вы описываете (насмешка utilMethod для разрешения / отклонения) - это хороший подход.

Вот простой рабочий пример, с которого можно начать:

Примечание : я реализовал functionOne как метод класса и functionTwo как свойство экземпляра , чтобы показать, как шпионить за обоими типами функций :

util.js

export const utilMethod = async () => 'original';

code.js

import { utilMethod } from './util';

export class MyClass {
  functionOne() { }  // <= class method
  functionTwo = () => { }  // <= instance property
  theClassMethod() {
    return utilMethod().then(
      result => { this.functionOne() },
      error => { this.functionTwo() }
    );
  }
}

code.test.js

import { MyClass } from './code';
import * as util from './util';

test('theClassMethod', async () => {
  const mock = jest.spyOn(util, 'utilMethod');

  const instance = new MyClass();

  const functionOneSpy = jest.spyOn(MyClass.prototype, 'functionOne');  // <= class method
  const functionTwoSpy = jest.spyOn(instance, 'functionTwo');  // <= instance property

  mock.mockResolvedValue('mocked value');  // <= mock it to resolve
  await instance.theClassMethod();
  expect(functionOneSpy).toHaveBeenCalled();  // Success!

  mock.mockRejectedValue(new Error('something bad happened'));  // <= mock it to reject
  await instance.theClassMethod();
  expect(functionTwoSpy).toHaveBeenCalled();  // Success!
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...