Saltar al contenido

Detección de plataforma simulada en Jest y React Native

Solución:

Esto funcionó para mi (Broma 21.2.1, Enzima 3.2.0):

jest.mock('Platform', () => {
    const Platform = require.requireActual('Platform');
    Platform.OS = 'android';
    return Platform;
});

Colóquelo en la parte superior de su prueba o en un beforeAll por ejemplo.

La forma en que logré burlarse de la configuración de la plataforma fue simplemente configurándola directamente en las pruebas:

it('should only run for Android', () => {
  Platform.OS = 'android'; // or 'ios'

  // For my use case this module was failing on iOS
  NativeModules.MyAndroidOnlyModule = {
    fetch: jest.fn(
      (url, event) => Promise.resolve(JSON.stringify(event.body))
    ),
  }; 
  return myParentFunction().then(() => {
    expect(NativeModules.MyAndroidOnlyModule.fetch.mock.calls.length).toBe(1);
    expect(fetch.mock.calls.length).toBe(0);
  });
});

Esto configuraría la plataforma para que solo se ejecutara en Android durante las pruebas para asegurarme de que mi función llamaba solo a funciones específicas. Mi función que estaba envuelta en la compilación dependiente de la plataforma se veía así:

export default function myParentFunction() {
  if (Platform.OS === 'ios') {
    return fetch();
  }
  return NativeModules.MyAndroidOnlyModule.fetch();
}

Sugeriría simplemente crear dos pruebas diferentes, una con la plataforma configurada para iOS y la otra para Android, ya que idealmente una función solo debería tener una responsabilidad. Sin embargo, estoy seguro de que puede usar esto para ejecutar la primera prueba, configurar dinámicamente la plataforma y ejecutar la prueba número dos, todo en una función.

Para todos los que buscan esto, lo que me ayudó fue lo siguiente:

jest.mock('react-native/Libraries/Utilities/Platform', () => ({
    OS: 'android', // or 'ios'
    select: () => null
}));
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *