Моя фиктивная функция не вызывается в тесте Sagas - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь протестировать Sagas с помощью Jest, но не могу заставить Sagas вызывать макетированную функцию loginApi . Кажется, она вызывает реальную функцию. Может ли кто-нибудь помочь мне с этим?

Это моя сага:

export async function loginApi(user) {
  return await api.post('/auth/customers/login', {
    email: user.email, //customer1@mi.me
    password: user.password, //12345678
  });
}

// Saga function that handles the side effect when the loginWatcher is triggered
export function* loginActionEffect(loginAction) {
  //console.tron.log('login Action Effect');

  try {
    const response = yield call(loginApi, loginAction.user);
    // console.log('response:' + response);

    yield AsyncStorage.setItem('access_token', response.data.access_token);
    yield put(LoginActions.setLogin(loginAction.user));
    yield put(LoginActions.setError(''));
  } catch (e) {
    //console.log('problema com o login!');
    yield put(LoginActions.setError('Email ou senha incorretos!'));
  }
}

Это мой тест:

it('should receive token in case of success', async () => {
    const mockToken = {token: 'kaajfalkfjlaniurvayeg'};
    const loginApi = jest.fn().mockImplementation(() => Promise.resolve(mockToken));
    const dispatched = [];

    const result = await runSaga(
      {
        dispatch: action => dispatched.push(action),
      },
      loginActionEffect,
    );

    expect(loginApi).toHaveBeenCalled();
    expect(dispatched).toContainEqual(Creators.setLogin());
    expect(dispatched).toContainEqual(Creators.setError());
    loginApi.mockClear();
  });

И вот мой результат теста:

expect(jest.fn()).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0

  21 |     );
  22 | 
> 23 |     expect(loginApi).toHaveBeenCalled();
     |                      ^

1 Ответ

0 голосов
/ 15 января 2020

runSaga возвращает объект Task, а не Promise, поэтому вам нужно вызвать toPromise

const result = await runSaga(
  {
    dispatch: action => dispatched.push(action),
  },
  loginActionEffect,
).toPromise();

PS. Ваш способ тестирования саг идет вразрез с рекомендованным. Пожалуйста, прочитайте это документы . Как я написал в своем комментарии. В декларативных эффектах есть одна замечательная вещь: выполнение эффекта зависит от интерпретатора. Таким образом, вам не нужно ничего выполнять или проверять в своих тестах.

...