Проверьте разные случаи для входа в Facebook - PullRequest
1 голос
/ 10 марта 2020

Я реализую вход в Facebook в приложении React Native, используя https://github.com/facebook/react-native-fbsdk.

В моем коде у меня разные результаты в зависимости от того, какие разрешения пользователь предоставляет и в зависимости от того, или нет. ошибка не возникает:

handleFacebookLogin = async () => {
  const result = await LoginManager.logInWithPermissions([
    "public_profile",
    "email"
  ]);
  if (result.isCancelled) {
    //do nothing, the user cancelled
  } else {
    const data = await AccessToken.getCurrentAccessToken();
    if (!data) {
      this.showAlert(
        strings.onboarding.fb_login.error_title,
        strings.onboarding.fb_login.error_body,
        strings.onboarding.fb_login.ok_button
      );
    } else {
      if (result.grantedPermissions.toString().contains("user_email")) {
        //navigate to screen A
      } else {
        //navigate to screen B
      }
    }
  }
};

showAlert = (title, body, button) => {
  //show alert
};

Я хочу написать тест для каждого случая (например, возникает ошибка, пользователь дает разрешение на электронную почту, пользователь НЕ дает разрешение на электронную почту).

Я начал писать тест для показа предупреждения при возникновении ошибки, но я застрял в том, чтобы высмеивать фактическую ошибку (сценарий if (! Data) из приведенного выше кода).

it("Shows an alert when an error occurs", () => {
  const errorMock = jest.fn();
  const loginMock = jest.fn();
  let ageScreen = renderer
    .create(<AgeScreen showAlert={errorMock} handleFacebookLogin={loginMock} />)
    .getInstance();

  const spy = jest
    .spyOn(ageScreen, "showAlert")
    .mockImplementation(/*TODO: mock fb library error */);

  ageScreen.handleFacebookLogin();
  expect(spy).toHaveBeenCalled();
});

Мои вопросы:

  1. Как мне завершить sh этот контрольный пример, чтобы я мог надежно проверить, будет ли отображаться предупреждение в случае ошибки?

  2. Как мне протестировать другой сценарий ios (например, перейти к экрану А, если пользователь предоставляет разрешение по электронной почте)?

Заранее спасибо! :)

1 Ответ

1 голос
/ 11 марта 2020

Сначала вам нужно смоделировать LoginManager и AccessToken

jest.mock('react-native-fbsdk', () => ({
  ...jest.requireActual('react-native-fbsdk'),
  LoginManager: {
    logInWithPermissions: jest.fn(),
  },
  AccessToken: {
    getCurrentAccessToken: jest.fn(),
  }
}));

Затем в каждом тестовом примере смоделируйте результат, который приведет к сценарию, который вы проверяете

it("Shows an alert when an error occurs", () => {
  const errorMock = jest.fn();
  const loginMock = jest.fn();
  // put what result will get
  LoginManager.logInWithPermissions.mockReturnValue(...);
  // put what data will get
  AccessToken.getCurrentAccessToken.mockReturnValue(...);

  let ageScreen = renderer
    .create(<AgeScreen showAlert={errorMock} handleFacebookLogin={loginMock} />)
    .getInstance();

  const spy = jest
    .spyOn(ageScreen, "showAlert")

  ageScreen.handleFacebookLogin();
  expect(spy).toHaveBeenCalled();
});

и в отношении ваших вторых вопросов это будет то же самое: смоделируйте зависимости и убедитесь, что выполняются соответствующие вызовы

...