2016-06-23 10 views
0

So bin ich zur Zeit nach dem festgelegten Format durch reagieren nativer:Integration Testing Reagieren Native iOS nicht drucken (console.log)

(komplette Randnotiz: Wenn Sie eine Million Stunden mußten eingestellt up integration testing wie ich habe lassen Sie mich Ihnen helfen und den Code unten verwenden und dann alles, was Sie tun müssen, ist das Schema zu bearbeiten und ein run Argument.Überprüfen Sie ihre UIExplorer Anwendung, um herauszufinden, was das Argument war und was es zu tun und Zeug. Sie müssen nur das Hauptziel einstellen. Auch IntegrationTesting.js und Tests.js in den Stamm des Ordners setzen.)

Zurück zu der Frage:

https://facebook.github.io/react-native/docs/testing.html

Und ich habe drei Dateien. Sie sind IntegrationTests.m, IntegrationTests.js und Tests. IntegrationTests.m sieht wie folgt aus:

#import <UIKit/UIKit.h> 
#import <XCTest/XCTest.h> 

#import <RCTTest/RCTTestRunner.h> 

#import "RCTAssert.h" 

#define RCT_TEST(name)     \ 
- (void)test##name      \ 
{          \ 
[_runner runTest:_cmd module:@#name]; \ 
} 

@interface UIExplorerIntegrationTests : XCTestCase 

@end 

@implementation UIExplorerIntegrationTests 
{ 
    RCTTestRunner *_runner; 
} 

- (void)setUp 
{ 
    _runner = RCTInitRunnerForApp(@"IntegrationTests", nil); 
} 

#pragma mark - Test harness 

- (void)testTheTester_waitOneFrame 
{ 
    [_runner runTest:_cmd 
      module:@"Tests" 
     initialProps:@{@"waitOneFrame": @YES} 
configurationBlock:nil]; 
} 


#pragma mark - JS tests 

// This list should be kept in sync with IntegrationTestsApp.js 
RCT_TEST(Tests) 



@end 

IntegrationTests.js wie diese

'use strict'; 

var React = require('react'); 
var ReactNative = require('react-native'); 
var { 
    AppRegistry, 
    ScrollView, 
    StyleSheet, 
    Text, 
    TouchableOpacity, 
    View, 
} = ReactNative; 

var TESTS = [ 
    require('./Tests'), 
]; 

TESTS.forEach(
    (test) => AppRegistry.registerComponent(test.displayName,() => test) 
); 

// Modules required for integration tests 
// require('LoggingTestModule'); 

type Test = any; 

var IntegrationTests = React.createClass({ 
    getInitialState: function() { 
    return { 
     test: (null: ?Test), 
    }; 
    }, 
    render: function() { 
    if (this.state.test) { 
     return (
     <ScrollView> 
      <this.state.test /> 
     </ScrollView> 
    ); 
    } 
    return (
     <View style={styles.container}> 
     <Text style={styles.row}> 
      Click on a test to run it in this shell for easier debugging and 
      development. Run all tests in the testing environment with cmd+U in 
      Xcode. 
     </Text> 
     <View style={styles.separator} /> 
     <ScrollView> 
      {TESTS.map((test) => [ 
      <TouchableOpacity 
       onPress={() => this.setState({test})} 
       style={styles.row}> 
       <Text style={styles.testName}> 
       {test.displayName} 
       </Text> 
      </TouchableOpacity>, 
      <View style={styles.separator} /> 
      ])} 
     </ScrollView> 
     </View> 
    ); 
    } 
}); 

var styles = StyleSheet.create({ 
    container: { 
    backgroundColor: 'white', 
    marginTop: 40, 
    margin: 15, 
    }, 
    row: { 
    padding: 10, 
    }, 
    testName: { 
    fontWeight: '500', 
    }, 
    separator: { 
    height: 1, 
    backgroundColor: '#bbbbbb', 
    }, 
}); 

AppRegistry.registerComponent('IntegrationTests',() => IntegrationTests); 

Tests.js sieht wie folgt aussieht:

'use strict'; 

var React = require('react'); 
var ReactNative = require('react-native'); 

var { 
    Text, 
    View, 
} = ReactNative; 
var { TestModule } = ReactNative.NativeModules; 

var Tests = React.createClass({ 
    propTypes: { 
    waitOneFrame: React.PropTypes.bool 
    }, 

    getInitialState() { 
    return { 
     done: false, 
    }; 
    }, 

    componentDidMount() { 
    console.log("I'll never see this print statement in the xcode console") 
    this.runTest(); 
    }, 

    runTest() { 

    async function SampleCall(){ 
     try{ 
      console.log("hey whatsup inside async!") 
     }catch(e){ 
      throw new Error("ERROR: " + e); 
      console.log("download failed: " + e) 
     } 
    } 
    SampleCall(); 


    }, 

    render() { 
    return (
     <View style={{backgroundColor: 'white', padding: 40}}> 
     <Text> 
      {this.constructor.displayName + ': '} 
      {this.state.done ? 'Done' : 'Testing...'} 
     </Text> 
     </View> 
    ); 
    } 
}); 

Tests.displayName = 'Tests'; 

module.exports = Tests; 

Für einige Grund, warum ich nicht drucken kann console.log. Ob ich innerhalb einer Async-Funktion drucke oder nicht, kann ich nicht drucken. Ich habe versucht, die Remote-Debugger-Methode verwenden, aber das verursachte seltsames Verhalten. Ich war in der Lage zu drucken, aber meine Tests brechen würde und beschweren sich über diese:

  • Make sure Packager server is running.
  • Make sure the JavaScript Debugger is running and not paused on a breakpoint or exception and try reloading again."

Und ja, ich versuchte localhost meine IP-Adresse einstellen und dann das Ganze begann vor mehr ausgeflippt.

NSString *URLString = [NSString stringWithFormat:@"http://MY.IPA.DDR.ESS:%zd/debugger-proxy?role=client", port]; 

failed: caught "NSInternalInconsistencyException", "RedBox error: Runtime is not ready for debugging.

Wenn Sie entweder wissen, warum meine console.log Aussagen in der Xcode-Konsole auf laufenden xctests im Format unsichtbar sind, die native reagieren hat ihre Integrationstests einrichten oder Sie wissen, warum ich bin Ich kann den Remote-Debugger nicht einrichten, bitte hilf mir! Danke

Antwort

0

Sie sollten Reactotron für die Protokolle versuchen und AVA testen. Testen mit diesem Tool ist viel einfacher als Ihr derzeitiger Ansatz, this ist ein paar Beispiele dafür, wie es gemacht wurde, es hat mir viel Zeit erspart.