2016-07-10 56 views
4

组件正在导入包含本机模块的库。这是一个人为的例子:如何模拟第三方React Native NativeModules?

import React from 'react'; 
import { View } from 'react-native'; 
import { Answers } from 'react-native-fabric'; 

export default function MyTouchComponent({ params }) { 
    return <View onPress={() => { Answers.logContentView() }} /> 
} 

这里是Answersreact-native-fabric相关部分:

var { NativeModules, Platform } = require('react-native'); 
var SMXAnswers = NativeModules.SMXAnswers; 

当导入在摩卡测试这个组件,这个失败的帐户SMXAnswersundefined

你如何模拟SMXAnswersreact-native-fabric,以便它不会中断并允许您测试哟你的组件?

p.s .:你可以看到full setupcomponent我正试图在GitHub上测试。

+1

最后我发现正是我有同样的问题。不幸的是,没有答案(截至目前)。你有没有找到解决方案? – Michael

+0

@Michael我昨天回答了我的问题;你看见了吗? –

+1

非常感谢您回答您的问题。我实际上创建了一个类似的问题:http://stackoverflow.com/questions/39633977/react-native-testing-mocking-redux-async-action-creators。现在我已经把我的本地依赖移动到了一个单独的模块,所以它不会干扰我的测试。但是我肯定会使用你的Mockery-setup。 – Michael

回答

2

使用mockery嘲笑任何本机模块,像这样:

import mockery from 'mockery'; 

mockery.enable(); 
mockery.warnOnUnregistered(false); 
mockery.registerMock('react-native-fabric', { 
    Crashlytics: { 
    crash:() => {}, 
    }, 
}); 

下面是一个完整setup example

import 'core-js/fn/object/values'; 
import 'react-native-mock/mock'; 

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

mockery.enable(); 
mockery.warnOnUnregistered(false); 
mockery.registerMock('react-native-fabric', { 
    Crashlytics: { 
    crash:() => {}, 
    }, 
}); 

const modulesToCompile = [ 
    'react-native', 
].map((moduleName) => new RegExp(`/node_modules/${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 { 
    const matches = modulesToCompile.filter((regex) => regex.test(filename)); 
    const shouldIgnore = matches.length === 0; 
    return shouldIgnore; 
    } 
} 

register(config); 
相关问题