【问题标题】:How to test React Native Module?如何测试 React Native 模块?
【发布时间】:2019-10-03 03:10:38
【问题描述】:

我开发了一个 React Native 模块(包装了一个 SDK),我对使用 mocha 创建一些单元测试很感兴趣。我对摩卡不是很熟悉,但我不知道该怎么做。

我有我的 react 原生模块,称之为 react-native-mymodule,我可以通过以下方式在应用程序中使用它:

npm install react-native-mymodule

react-native link react-native-mymodule

然后我可以导入我的模块:

import MySDK from "react-native-mymodule”;

我正在尝试对单元测试做类似的事情。在我的根目录中,我有一个 test/ 目录,这是我要保存所有单元测试的地方。

我在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);
    });
  });
});

我尝试修改了一个tutorial,我在网上找到了编译模块,但没有任何运气。这是一个文件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 在我的模块的根级别

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

我有一个test/mocha.opts 文件:

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

我正在使用:./node_modules/mocha/bin/mocha 调用 mocha,但出现错误:

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

谁能告诉我测试反应原生模块的最佳方法?

【问题讨论】:

  • 不确定我是否理解?您是要导出 sdk 以便在手机上进行测试还是已经构建了 sdk?您是在有或没有博览会的情况下进行开发吗?
  • @RachelGallen 我有一个包含原生 SDK 的“原生模块”,例如 facebook 有这个:github.com/facebook/react-native-fbsdk。测试这种东西的最佳方法是什么?
  • 您有什么理由 don`t want to create an alias 并模拟该模块吗?这个问题可能是由transforms 引起的吗?你也可以check this issue
  • 我会尝试隔离问题并将新项目设置为in this guide,尝试使其工作,然后导入您的模块。隔离可以帮助您了解导致问题的原因。我们不知道这是由babel 引起的还是由测试环境中的node_modules 目录问题引起的
  • 请原谅我的无知,但是模块的测试不应该是模块源的一部分而不是其他地方吗?作为模块的用户/消费者,我依赖我的依​​赖项进行单元测试。在消费部分,即我的应用程序中,我模拟模块,因为我知道模块可以工作(正在单元测试和所有)

标签: javascript reactjs react-native mocha.js


【解决方案1】:

如果你想测试原生模块,我建议如下:

1。端到端测试

Node.js 独立无法解释本机模块。如果您想在应用程序的上下文中测试原生模块,您需要使用 appium/webdriverio 创建 e2e 测试,而不是使用 mocha 编写单元测试。

这样,您实际上启动了一个安装了您的应用的模拟器。

资源:

2。单元测试

如果您想为您的原生模块编写单元测试,请使用编写原生模块的语言编写它们

资源:


除此之外,您必须模拟模块。

【讨论】:

  • 您也可以使用酶,酶是用于 React 的 JavaScript 测试实用程序,可以更轻松地测试您的 React 组件的输出。它也是 E2E 测试的不错选择。 enzymejs.github.io/enzyme
  • 使用 Appium 和 Detox,甚至 Espresso 和 XCUITest 可以对原生模块进行 UI 测试,但我现在想知道的是,是否可以使用 Appium 或排毒然后触发 XCUITests 或 Espresso?假设您正在将一个已经存在的本机应用程序(及其 E2E 测试)移植到 React Native。
  • @samk Appium 应该可以实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
相关资源
最近更新 更多