测试失败,我不知道为什么?

时间:2020-03-14 11:23:06

标签: react-native jestjs

我有一个LandingScreen组件,其中包含一个onPositivePermission函数。在此函数中,我从FacebookConnector调用了静态登录方法。我想测试登录方法确实在onPositivePermission中被调用。我尝试了不同的测试,但是没有一个起作用。我的组件如下:

LandingScreen

class LandingScreen extends Component {
    constructor(props) { 
        super(props); 
        this.loginMethods = { 
             fbLogin: 0, 
             emailLogin: 1, 
         } 
    }

onPositivePermission = loginMethod => {
    if (loginMethod === this.loginMethods.fbLogin) 
        { FacebookConnector.login(); 
    } 
};

FacebookConnector

export default class FacebookConnector {
    static login = async() => { 
        try { const result = await LoginManager.logInWithPermissions([                                    'public_profile', 'email', ]); 
        if (result.isCancelled) { 
            //do nothing, the user cancelled 
        } else { 
            //handle Facebook login } 
    } catch (error) { 
        //handle error  
        } 
    };

这是我的考验:

  it('Calls the Facebook login method', () => {
    const fbLogin = 0;
    const landingScreen = renderer.create(<LandingScreen />).getInstance();
    let loginMock = jest.fn();
    jest.mock('../../connectors/Facebook/FacebookConnector', () => ({
      default: class {
        static login() {
          mock.loginMock;
        }
      },
    }));

    landingScreen.onPositivePermission(fbLogin);
    expect(loginMock).toHaveBeenCalled();
  });

我还尝试如下模拟FacebookConnector:

jest.mock('../../connectors/Facebook/FacebookConnector', () => ({
      login: mock.loginMock,
    }));

但是,在两种情况下,我都会得到:

 expect(jest.fn()).toHaveBeenCalled()
 Expected number of calls: >= 1
 Received number of calls:    0

我已经在onPositivePermission()函数中添加了日志,并发现确实由测试调用了该日志,但是Expect语句仍然失败。

我还尝试过删除onPositivePermission();中的if语句,期望仍然失败。

请注意,我手动测试了功能并调用了FacebookConnector.login() ,但我也想对其进行单元测试。

有人知道为什么单元测试不起作用吗?

1 个答案:

答案 0 :(得分:1)

loginFacebookConnector类中的静态方法,因此您可以通过以下方式对其进行模拟。

it('Calls the Facebook login method', () => {
  const fbLogin = 0;
  const landingScreen = renderer.create(<LandingScreen />).getInstance();

  const loginMock = jest.fn();
  loginMock.mockReturnValue('some value');
  FacebookConnector.login = loginMock;

  landingScreen.onPositivePermission(fbLogin); 
  expect(loginMock).toHaveBeenCalled();
});

P.S。您无需添加返回值,没有该返回值就可以使用。

让我们更清楚一点: expect(jest.fn()).toHaveBeenCalled()不起作用,因为尚未实际调用jest.fn()。您仅创建一个jest.fn实例并期望它被调用。

但是如果您将其分配给变量,然后调用该函数

const someFunction = jest.fn(); //creating a jest.fn instance
someFunction(); //we are calling the function here.
expect(someFunction).toHaveBeenCalled() // it will pass

它将正常工作。