2016-12-27 34 views
8
İşte

ben Tepki kullanarak test çalışıyorum basit bir bileşendir Yerli 0,39 ve Jest 18:Özel bir yerel modül Jest ile içe aktarılan React Native bileşen nasıl test edilir?

İşte
// 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); 

TestModule ve test yöntemdir:

Aşağıdaki test hatası ile başarısız
// ios/TestProject/TestModule.m 

#import "TestModule.h" 

@implementation TestModule 

RCT_EXPORT_MODULE(); 

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

@end 

TypeError: Cannot read property 'test' of undefined: Ben, nasıl Mock native modules using jest.mock üzerine Jest dokümanlar okumak ama var

// __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 /> 
); 
}); 

st duyuyorum Jest'in NativeModules alayının benim TestModule sınıfımı da içerecek şekilde nasıl genişletileceği açık değil.

cevap

8

:

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

describe('TestProject',() => { 
    beforeEach(() => { 
    NativeModules.TestModule = { test: jest.fn() } 
    }); 
    ... 
}); 
+0

Teşekkürler! 'BeforeEach' içine geçen işlev kapanış bir kaşlı ayraç eksik, ancak aksi takdirde bir çekicilik gibi çalışır. Bunun yerine 'beforeAll 'kullanmayı tercih ettim, çünkü bu kurulumun her özellikten önce değil, sadece bir kez çalıştırılması gerekiyor. – andybangs

+0

Harika, ve eksik küme ayracı ekledim. – rgoldfinger

1

Jest bir JavaScript test aracıdır, doğal bir modülde Objective C/Swift/Java'da yazdığınız kodu çalıştırmaz. Yerel bir modülün işlevselliğiyle dalga geçebilir, böylece bağlandığınız yaklaşımla JavaScript’ten çağırabilirsiniz. Örneğin.

jest.mock('NetInfo',() => { 
    return { 
    isConnected: { 
     fetch:() => { 
     return new Promise((accept, resolve) => { 
      accept(true); 
     }) 
     } 
    } 
    } 
}); 
Siz sadece yerli modül olmalıdır bir taklidini ekleyebilir
+2

mümkün olan tüm fonksiyon, özellik alay etmeyi unutmayın. OP, "tepki-yerel" den aktarılan 'NativeModules.TestModule' ile nasıl uğraştığınızı soruyor. 'Tepki-test-renderer' çalışmak için geçersiz kılmak için 'tepki-yerli', alay edilmek değil, ithal edilmesi gerektiğinden beri sıkışıp kaldım. – rgoldfinger

+1

@rgoldfinger doğrudur. Yerel modülün kendisini test etmeye çalışmıyorum, ancak 'index.ios.js' yi test etmek için 'NativeModules.TestModule' ile uğraşmaya çalışmıyorum. – andybangs

+0

Yerel modülü test etmenin bir yolu var mı? – Dor

1
#__mocks__/react-native-modules 

const ReactNative = require('react-native') 

ReactNative.NativeModules = { 
    Defaults: { 
    RU: { 
     publicKey: '', 
     privateKey: '', 
    }, 
    }, 
} 

module.exports = ReactNative 

ve sonra

# in test file 
jest.mock('react-native-modules') 
import 'react-native-modules' 
1

modelleme Bu sayede, jest önce (bir kez alay edecek başlar)

import {NativeModules} from 'react-native'; 

NativeModules.YourNativeBridge = { 
    property: jest.fn() 
}; 

__mocks__/your-native-bridge.js

module.exports = { 
    preset: 'react-native', 
    setupFiles: ['./__mocks__/your-native-bridge.js'] 
}; 
0 Bunu ben de var sorusunu, misunderstands düşünüyorum YourNativeBridge