1
votes

React (Native) setup Jest pour tester le composant Contexte

L'API React Context me permet de placer la logique de l'état de l'application au même endroit (et d'éviter le redux). Pour le moment, cela ressemble à ceci

rm -rf node_modules/ yarn.lock package-lock.json && npm install

Le code entier peut être trouvé ici .

Quelle est la meilleure pratique pour créer des tests de plaisanterie qui me permettent de tester les fonctions et de ne pas gâcher l'état? p>

(Je souhaite éviter d'utiliser Enzyme (développé par AirBnB) - puisque AirBnB a officiellement abandonné l'utilisation de React Native )

Exemple

Comment faire un test qui confirme cela lorsque j'appelle setDose (2) que le productData.dose a été changé de "5 mg" et équivaut maintenant à "2 mg . Mais alors remettre l'état à "5 mg" pour l'autre test.

INFO BONUS

J'ai du mal à obtenir plaisanterie code> pour travailler avec moi (afin que je puisse essayer les solutions suggérées)

package.json

> @ test /Users/norfeldt/Desktop/React-Native/MedBlockChain
> jest --watchAll

● Validation Error:

  Module react-native/jest/hasteImpl.js in the haste.hasteImplModulePath option was not found.
         <rootDir> is: /Users/norfeldt/Desktop/React-Native/MedBlockChain

  Configuration Documentation:
  https://jestjs.io/docs/configuration.html

npm ERR! Test failed.  See above for more details.

Cela me jette juste ça

{
  "main": "node_modules/expo/AppEntry.js",
  "private": true,
  "scripts": {
    "test": "jest --watchAll"
  },
  "dependencies": {
    "@expo/samples": "2.1.1",
    "crypto-js": "^3.1.9-1",
    "date-fns": "^1.29.0",
    "expo": "^28.0.0",
    "invert-color": "^1.2.3",
    "lodash": "^4.17.10",
    "react": "16.3.1",
    "react-native": "https://github.com/expo/react-native/archive/sdk-28.0.0.tar.gz",
    "react-native-qrcode": "^0.2.6",
    "react-native-slider": "^0.11.0",
    "react-native-switch": "^1.5.0",
    "react-navigation": "2.3.1",
    "whatwg-fetch": "^2.0.4"
  },
  "devDependencies": {
    "babel-eslint": "^10.0.1",
    "babel-preset-expo": "^5.0.0",
    "eslint": "^5.16.0",
    "eslint-config-codingitwrong": "^0.1.4",
    "eslint-plugin-import": "^2.17.2",
    "eslint-plugin-jest": "^22.5.1",
    "eslint-plugin-jsx-a11y": "^6.2.1",
    "eslint-plugin-react": "^7.13.0",
    "jest-expo": "^32.0.0",
    "react-native-testing-library": "^1.7.0",
    "react-test-renderer": "^16.8.6"
  },
  "jest": {
    "preset": "jest-expo"
  }
}

J'ai essayé des choses comme

// Using the Context API used in react 16.3 - https://www.youtube.com/watch?v=XLJN4JfniH4
const { Provider, Consumer: ContextConsumer } = React.createContext()

class ContextProvider extends Component {

  ...// lot of functions ...

  render() {
    return (
      <Provider
        value={{
          ...this.state,
          getDose: this.getDose,
          getDoseRange: this.getDoseRange,
          setDose: this.setDose,
          checkIN: this.checkIN,
          checkOUT: this.checkOUT,
          getFalsifiedDrug: this.getDefaultproductData,
          updatePrescriptionDose: this.updatePrescriptionDose,
        }}
      >
        {this.props.children}
      </Provider>
    )
  }
}

module.exports = { ContextConsumer, ContextProvider }


2 commentaires

Je pense que vous pouvez utiliser: github.com/airbnb/enzyme , cette bibliothèque fournit une bonne API pour tester état et ainsi de suite.


Merci, mais AirBnB a cessé d'utiliser React Native, j'aimerais donc éviter de l'utiliser car je m'attends à ce qu'il ne soit destiné qu'à React (web).


3 Réponses :


1
votes

Vous pouvez utiliser react-test-renderer que vous êtes déjà en utilisant dans les spécifications de votre projet.
Ce dont vous avez besoin est d'appeler testRenderer.getInstance () code > => vérifier l ' état actuel => invoquer certaines méthodes dont vous avez besoin pour tester => vérifier l' état mis à jour :

module.exports = function(api) {
  api.cache(true);
  return {
    presets: ["babel-preset-expo"],
    env: {
      development: {
        plugins: ["transform-react-jsx-source"]
      }
    }
  };
};

L'état des autres tests ne sera pas affecté.

La seule chose dont j'avais besoin pour que cela fonctionne avec votre dépôt est de npm install whatwg-fetch@2.0.4 --save comme décrit ici . J'espère que cela vous aidera.

 saisissez la description de l'image ici

Même si cela est supposé être une autre question et la solution évidente est de créer un nouveau projet rn et de copier votre code dedans, mais voici ce que j'ai fait pour corriger les erreurs jest sur votre code:

1)

Faire correspondre les versions (comme décrit dans les commentaires ...):

"expo": "^32.0.0",
"jest-expo": "^32.0.0",
// and maybe even
"react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",

2) À corriger une erreur

api.caller n'est pas une fonction

utilisez babel.config.js comme décrit ici :

import React from "react";
import { create } from "react-test-renderer";
import { ContextProvider } from "../Context";

describe("ContextProvider", () => {
  test("it updates dose correctly", () => {
    const component = create(<ContextProvider />);
    const instance = component.getInstance();

    expect(instance.getDose()).toBe(5);
    expect(instance.state.productData.dose).toBe("5 mg");

    instance.setDose(2);

    expect(instance.getDose()).toBe(2);
    expect(instance.state.productData.dose).toBe("2 mg");
  });

  test("it updates something else correctly", () => {
    // ...
  });
});

3) Utilisez yarn en raison de ceci


4 commentaires

Votre réponse a beaucoup de sens pour moi. Je n'arrive tout simplement pas à faire fonctionner jest avec moi pour pouvoir l'essayer. Il continue de lancer une Erreur de validation indiquant que Module react-native / jest / hasteImpl.js dans l'option haste.hasteImplModulePath est introuvable.


J'ai essayé des choses comme m -rf node_modules / yarn.lock package-lock.json && npm install


C'est étrange. Je n'ai pas fait face à ce problème. La première chose qui vous vient à l'esprit est de faire correspondre les versions expo et jest-expo . Ne mélangez pas non plus le npm et le fil. Tenez-vous en à une chose car cela peut causer des problèmes. Et voici une autre suggestion à essayer


En fait, j'ai parcouru tous les sites que vous avez suggérés quelques fois auparavant et je ne peux pas le faire fonctionner.



0
votes

Si vous cherchez un remplaçant pour Enzyme, je pense que vous devriez regarder ici: https://callstack.github.io/react-native-testing-library/

Cette bibliothèque vous permettra d'utiliser la update fournie pour changer les valeurs que vous testez, puis les modifier à nouveau.

Excellente bibliothèque pour React Native - la page de démarrage dit tout ça . Si vous êtes intéressé par du code pour vous aider à démarrer, je peux également travailler sur quelque chose.


0 commentaires

0
votes

Je vous suggère de tester uniquement votre logique unitaire et d'envisager d'éviter complètement les tests de composants dans ce cas.

Vous pouvez extraire vos méthodes dans un "Presenter" pour traiter vos données et tester uniquement cette logique. Avec cette approche, il est facile de tester le présentateur qui a une logique d'entrée / sortie pure.

Le présentateur, par exemple, peut ressembler à ceci:

// DosePresenter.test.js

describe('DosePresenter tests', () => {
  let uut;

  beforeEach(() => {
    uut = require('./DosePresenter');
  });

  it('should process a dose', () => {
    const value = 10;
    const productData = {};
    expect(uut.processDose(value, productData)).toEqual(...);
  });
};

L'usage:

// Context.js

import * as DosePresenter from './DosePresenter';

const setDose = (value) => this.setState(DosePresenter.processDose(value, {...this.state}));

Maintenant, il devrait être plus facile de tester la logique:

// DosePresenter.js

const processDose = (value, productData) => {
  productData.dose = value.toFixed(0) + productData.dose.replace(/[\d\.]*/g, '')
  productData.productionTime = Conventions.datetimeStr();
  productData.hashSalt = this.makeHashSalt();
  return {productData, productDataHash: getHashOfproductData(productData)};
};

module.exports = {
  processDose
};


0 commentaires