如何测试使用Jest导入自定义本机模块的React Native组件?

and*_*ngs 15 unit-testing facebook ios jestjs react-native

这是一个简单的组件,我试图使用React Native 0.39和Jest 18进行测试:

// index.ios.js

import React, { Component } from 'react';
import { AppRegistry, NativeModules, View } from 'react-native';

export default class TestProject extends Component {
  componentDidMount() {
    NativeModules.TestModule.test();
  }

  render() {
    return <View style={{ flex: 1 }} />;
  }
}

AppRegistry.registerComponent('TestProject', () => TestProject);
Run Code Online (Sandbox Code Playgroud)

这是TestModule及其test方法:

// ios/TestProject/TestModule.m

#import "TestModule.h"

@implementation TestModule

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(test){
  NSLog(@"This is a test");
}

@end
Run Code Online (Sandbox Code Playgroud)

以下测试失败并显示错误TypeError: Cannot read property 'test' of undefined:

// __tests__/index.ios.js

import 'react-native';
import renderer from 'react-test-renderer';
import React from 'react';
import Index from '../index.ios.js';

it('renders correctly', () => {
  const tree = renderer.create(
    <Index />
  );
});
Run Code Online (Sandbox Code Playgroud)

我已经阅读了有关如何使用jest.mock模拟本机模块的Jest文档,但是我仍然不清楚如何扩展Jest的NativeModules模拟以包含我的TestModule类.

rgo*_*ger 15

你可以简单地在你的原生模块应该添加一个模拟:

import {
  NativeModules,
} from 'react-native';
import React from 'react';
import renderer from 'react-test-renderer';

describe('TestProject', () => {
  beforeEach(() => {
    NativeModules.TestModule = { test: jest.fn() } 
  });
  ...
});
Run Code Online (Sandbox Code Playgroud)

  • 它现在失败了(0.57),因为你不能将属性添加到只读对象 (6认同)

gr3*_*r3g 7

这样,您将嘲笑它一次(在开玩笑开始之前)

jest.config.js

module.exports = {
  preset: 'react-native',
  setupFiles: ['./__mocks__/your-native-bridge.js']
};
Run Code Online (Sandbox Code Playgroud)

__mocks__/your-native-bridge.js

import {NativeModules} from 'react-native';

NativeModules.YourNativeBridge = {
  property: jest.fn()
};
Run Code Online (Sandbox Code Playgroud)

不要忘记模拟所有可能的函数,属性 YourNativeBridge