Пожалуйста, поправьте меня, если я ошибаюсь, но можно ли решить эту проблему, немного изменив ваш тестовый пример?
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')
даст вам указание, что было вызвано первым.