React native 测试Facebook登录的不同情况

React native 测试Facebook登录的不同情况,react-native,jestjs,React Native,Jestjs,我正在使用React本机应用程序实现Facebook登录 在我的代码中,根据用户授予的权限和是否发生错误,我有不同的结果: handleFacebookLogin = async () => { const result = await LoginManager.logInWithPermissions([ "public_profile", "email" ]); if (result.isCancelled) { //do nothing, the

我正在使用React本机应用程序实现Facebook登录

在我的代码中,根据用户授予的权限和是否发生错误,我有不同的结果:

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(“发生错误时显示警报”,()=>{
const errorMock=jest.fn();
const loginMock=jest.fn();
让ageScreen=渲染器
.create()
.getInstance();
康斯特间谍=开玩笑
.spyOn(ageScreen,“showAlert”)
.mock实现(/*TODO:mock fb库错误*/);
ageScreen.handleFacebookLogin();
期望(间谍)。已被调用();
});
我的问题是:

  • 如何完成此测试用例,以便可靠地测试在出现错误时是否显示警报

  • 如何测试其他场景(例如,如果用户授予电子邮件权限,则导航到屏幕A)


  • 先谢谢你!:)

    首先需要模拟
    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();
    });
    
    it(“发生错误时显示警报”,()=>{
    const errorMock=jest.fn();
    const loginMock=jest.fn();
    //把结果放在哪里
    LoginManager.logInWithPermissions.mockReturnValue(…);
    //输入将获得的数据
    AccessToken.getCurrentAccessToken.mockReturnValue(…);
    让ageScreen=渲染器
    .create()
    .getInstance();
    康斯特间谍=开玩笑
    .spyOn(ageScreen,“showAlert”)
    ageScreen.handleFacebookLogin();
    期望(间谍)。已被调用();
    });
    

    关于第二个问题,也是一样的:模拟依赖项并验证是否正在进行相应的调用

    谢谢您的回答。我尝试了您的解决方案,但收到消息
    TypeError:\u reactNativeFbsdk.LoginManager.logInWithPermissions.mockReturnValue不是函数
    。关于如何修复此问题,有什么想法吗?稍后编辑:要修复
    TypeError:
    消息,我必须使用
    LoginManager:{logInWithPermissions:jest.fn().mockReturnValue(false),}
    中的
    jest.requireActual()
    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();
    });