Тест не пройден, и я не могу понять, почему ? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть компонент LandingScreen, который содержит функцию onPositivePermission. В этой функции я вызываю stati c метод входа из моего 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() и увидел, что она действительно вызывается тест, но, тем не менее, оператор wait не выполняется.

Я также попытался удалить оператор if в onPositivePermission(); continue, все равно не удается.

Обратите внимание, что я тестировал эту функциональность вручную и FacebookConnector.login() вызывается , но я также хочу провести его модульное тестирование.

Кто-нибудь знает, почему не работает модульный тест?

1 Ответ

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

login - это метод stati c в классе FacebookConnector, поэтому его можно смоделировать следующим образом.

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();
});

PS Вам не нужно добавлять возвращаемое значение, оно должно работать без этого.

Давайте уточним: 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

, она будет работать без проблем.

...