首页 > 解决方案 > 开玩笑的模拟导航服务

问题描述

我正在使用 react-navigation 并在我的代码中调用该服务。虽然我不确定如何模拟该navigate功能。这是我的代码:

import { NavigationActions } from 'react-navigation';

let _navigator;

function setTopLevelNavigator(navigatorRef) {
  _navigator = navigatorRef;
}

function navigate(routeName, params) {
  _navigator.dispatch(
    NavigationActions.navigate({
      routeName,
      params,
    })
  );
}

// add other navigation functions that you need and export them

export default {
  navigate,
  setTopLevelNavigator,
};

这是我到目前为止得到的:

export const loginEpic = (action$, state$, { ajax, navigate }) =>
  action$.pipe(
    ofType(LOGIN_REQUEST),
    map(() => state$.value),
    switchMap((options) =>
      ajax(options).pipe(
        pluck("response"),
        map((res) => loginSuccess(res)),
        tap((r) => navigate(ROUTES.DASHBOARD_SCREEN))
      )
    )
  );

navigatenavigationService.navigate,我从redux-observables.

测试看起来像这样:

const dependencies = {
      ajax: ({ }) => of(mockedResponseFromAjax),
      navigate: () => // ??? 
    };
    const result$ = loginEpic(action$, state$, dependencies).pipe(toArray());

标签: javascripttestingmockingjestjsredux-observable

解决方案


选项 1: - 对我有用的:

import NavigationService from '<your-path>/NavigationService';

beforeEach(() => {
    NavigationService.navigate = jest.fn();
});

在我的测试文件中。

选项 2: - 更好的版本

请参阅https://stackoverflow.com/questions/55319581/why-isn´t-mock-from-mock-folder-invoked-when-running-test-for-redux-action

激活模拟很重要,必须jest.mock('../../app/utils/NavigationService');将它放在测试文件的顶部,直接放在导入后面


推荐阅读