оригинальная функция была вызвана вместо шпионской функции в шутку - PullRequest
0 голосов
/ 09 мая 2020

Я отказался от того, что считаю простым. У меня есть следующее обещание:

информация. js

// other methods

export async function information() {

  let info= {
    code: ''
  };
  await AsyncStorage.multiGet([
    'code'
  ])
    .then((response) => {
      info['code'] = response[0][1]

    })
    .catch((e) => {
      console.log(e);
    });
  return info;
}

процесс. js:

импорт {информации} из "../information"

Promise.all([information()]).then(function (values) {

  if (values[0]['code'] != null) {
    // tag the code
  }
}).catch(err=>{
  console.log(err)
});

теперь в processor.test. js

import * as info from '../information';

it("should tag service code", async () =>{

  const spy = jest.spyOn(info,"information")
  spy.mockResolvedValue({'code':'ABC'})
  expect(tagCode()).toEqual('ABC_Y')

});

он не сообщает ожидаемый 'ABC_Y', но получил null. Из console.log в разрешенном обещании я вижу, что он выполняет исходный информационный метод, а не мой шпион, поэтому всегда возвращает значение null.

1 Ответ

0 голосов
/ 09 мая 2020

Пожалуйста, поправьте меня, если я ошибаюсь, но можно ли решить эту проблему, немного изменив ваш тестовый пример?

jest.spyOn(info, 'information').mockImplementationOnce(jest.fn(async () => { code: 'ABC' });

expect(tagCode()).toEqual('ABC_Y');

Я не тестировал этот код, просто мое мнение на 4: 42 ч. по крайней мере, какой-то способ помочь вам решить вашу проблему, хотя я признаю, что у меня было много проблем с Jest (особенно с зависимостями, хотя обычно это моя ошибка из-за проблем с контекстом).

I ' Я прочитал ваш вопрос несколько раз, но все еще не уверен, что я его понимаю, поэтому примите мои извинения, если приведенное выше вам не поможет.


export async function information() {

  let info= {
    code: ''
  };
  await AsyncStorage.multiGet([
    'code'
  ])
    .then((response) => {
      // this may produce different results
      info['code'] = response[0][1]

    })
    .catch((e) => {
      console.log(e);
    });
  return info;
}

Проблема могла быть выше, вы возвращаетесь info, я предполагаю, что он может содержать разрешенное значение из вашего оператора .then, насколько мне известно, в действительности это не сработает.

The .then обрабатывается в конец метода (после return), так что ваш info может содержать пустой code, а затем через некоторое время завершится Promise.

Я бы изменил это сверху на:


export async function information() {

  let info= {
    code: ''
  };
  await AsyncStorage.multiGet([
    'code'
  ])
    .then((response) => {
      info['code'] = response[0][1]
      Promise.resolve(info);
    })
    .catch((e) => {
      console.log(e);
    });
}

Хотя я бы рекомендовал не смешивать async / await с обещаниями, так как это довольно хороший способ выстрелить себе в ногу (мое мнение, конечно).

Вы можете протестировать эта теория, конечно, вставив комментарий над вашим return и внутри .then, простой console.log('called') | console.log('called1') даст вам указание, что было вызвано первым.

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