admin管理员组

文章数量:1287831

I developed a React Native module (wrapping an SDK) and I’m interested in creating some unit tests using mocha. I’m not very familiar with mocha, but I can’t exactly figure out how to proceed.

I have my react native module, call it react-native-mymodule which I can use in an app by doing:

npm install react-native-mymodule

react-native link react-native-mymodule

Then I can import my module with:

import MySDK from "react-native-mymodule”;

I’m trying to do a similar thing with unit tests. In my root directory I have a test/ directory which is where I want to hold all my unit tests.

My simple test file in test/sdk.tests.js

import MySDK from "react-native-mymodule”;
var assert = require('assert');


describe(‘MySDK’, function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.equal([1, 2, 3].indexOf(4), -1);
    });
  });
});

I’ve tried modifying a tutorial I found online on piling modules, but haven’t had any luck. This is a file test/setup.js:

import fs from 'fs';
import path from 'path';
import register from 'babel-core/register';

const modulesToCompile = [
  'react-native-mymodule’
].map((moduleName) => new RegExp(`${moduleName}`));


const rcPath = path.join(__dirname, '..', '.babelrc');
const source = fs.readFileSync(rcPath).toString();
const config = JSON.parse(source);
config.ignore = function(filename) {
  if (!(/\/node_modules\//).test(filename)) {
    return false;
  } else {
    return false;
  }
}

register(config);

.babelrc in the root level of my module

{
  "presets": ["flow", "react-native"],
    "plugins": [
      ["module-resolver", {
        "root": [ "./js/" ]
      }]
    ]
}

I have a test/mocha.opts file:

--require babel-core/register
--require test/setup.js

I’m invoking mocha with: ./node_modules/mocha/bin/mocha and I get an error:

Error: Cannot find module 'react-native-mymodule'

Can anyone advise me on the best way to test react native modules?

I developed a React Native module (wrapping an SDK) and I’m interested in creating some unit tests using mocha. I’m not very familiar with mocha, but I can’t exactly figure out how to proceed.

I have my react native module, call it react-native-mymodule which I can use in an app by doing:

npm install react-native-mymodule

react-native link react-native-mymodule

Then I can import my module with:

import MySDK from "react-native-mymodule”;

I’m trying to do a similar thing with unit tests. In my root directory I have a test/ directory which is where I want to hold all my unit tests.

My simple test file in test/sdk.tests.js

import MySDK from "react-native-mymodule”;
var assert = require('assert');


describe(‘MySDK’, function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.equal([1, 2, 3].indexOf(4), -1);
    });
  });
});

I’ve tried modifying a tutorial I found online on piling modules, but haven’t had any luck. This is a file test/setup.js:

import fs from 'fs';
import path from 'path';
import register from 'babel-core/register';

const modulesToCompile = [
  'react-native-mymodule’
].map((moduleName) => new RegExp(`${moduleName}`));


const rcPath = path.join(__dirname, '..', '.babelrc');
const source = fs.readFileSync(rcPath).toString();
const config = JSON.parse(source);
config.ignore = function(filename) {
  if (!(/\/node_modules\//).test(filename)) {
    return false;
  } else {
    return false;
  }
}

register(config);

.babelrc in the root level of my module

{
  "presets": ["flow", "react-native"],
    "plugins": [
      ["module-resolver", {
        "root": [ "./js/" ]
      }]
    ]
}

I have a test/mocha.opts file:

--require babel-core/register
--require test/setup.js

I’m invoking mocha with: ./node_modules/mocha/bin/mocha and I get an error:

Error: Cannot find module 'react-native-mymodule'

Can anyone advise me on the best way to test react native modules?

Share Improve this question edited May 21, 2019 at 22:12 Clip asked May 15, 2019 at 22:20 ClipClip 3,0789 gold badges43 silver badges78 bronze badges 7
  • Not sure I understand? are you looking to export an sdk so you can test it on a phone or have you built the sdk already? Are you developing with or without expo? – Rachel Gallen Commented May 21, 2019 at 22:26
  • @RachelGallen I have a "native module" which wraps native SDK's, for example facebook has this: github./facebook/react-native-fbsdk. Whats the best way to test something like that? – Clip Commented May 21, 2019 at 22:32
  • 2 is there some reason you don`t want to create an alias and mock that module? could this issue be caused from the transforms? also you may want to check this issue. – fabOnReact Commented May 22, 2019 at 13:22
  • I would try to isolate the problem and set up a new project as in this guide, try to get it to work and then import your module. Isolating may help you understand what is causing the issue. We don't know if this is caused from babel or from issues with the node_modules directories in test environment – fabOnReact Commented May 22, 2019 at 13:22
  • 4 please forgive my ignorance, but shouldn't the tests for the module be part of the module source and not be somewhere else? As a user/consumer of modules I rely on my dependencies to be unit tested. In the consuming part, i.e. my app, I mock modules because I know the module works (being unit tested and all) – konqi Commented May 28, 2019 at 13:12
 |  Show 2 more ments

1 Answer 1

Reset to default 5

If you want to test native modules, I suggest the following:

1. E2E Tests

Node.js standalone cannot interpret native modules. If you want to test native modules in the context of your app, you want to create e2e tests using appium/webdriverio instead of writing unit tests with mocha.

With this, you actually start an emulator with your app installed.

Resources:

  • http://appium.io/docs/en/about-appium/intro/?lang=de
  • https://medium./jetclosing-engineering/react-native-device-testing-w-appium-node-and-aws-device-farm-295081129790
  • https://medium./swlh/automation-testing-using-react-native-and-appium-on-ubuntu-ddfddc0c29fe
  • https://webdriver.io/docs/api/appium.html

2. Unit Tests

If you want to write unit tests for your native module, write them in the Language the Native Module is written in

Resources:

  • https://www.swiftbysundell./basics/unit-testing/
  • https://junit/junit5/
  • https://developer.apple./documentation/xctest
  • https://cmake/cmake/help/latest/manual/ctest.1.html


Other than that, you have to mock the modules.

  • https://jestjs.io/docs/en/mock-functions
  • https://sinonjs/releases/latest/mocks/
  • https://www.npmjs./package/mock-require

本文标签: javascriptHow to test React Native ModuleStack Overflow