导入和要求之间的区别在于开玩笑

时间:2016-06-22 14:09:32

标签: react-native jestjs

我正在使用react-native-router-fluxreact-redux编写我的第一个针对反应原生项目的测试

我的代码就像

jest.autoMockOff();
jest.setMock('react-native', {
    NativeModules: {}
});
jest.setMock('react-native-router-flux', {
    Actions: {}
});

const mockStore = require('../../mock/Store');
const actions = require('../myActions');
...
// Some tests that test if the right actions are dispatched.

以上是有效的,但是当我使用ES6 import代替require时,我遇到了问题。

如果我更换

const actions = require('../myActions');

import * as actions from "../myActions"

我收到以下错误。

Runtime Error
  - Error: Cannot find module 'ReactNative' from 'react-native.js'
        at Resolver.resolveModule (node_modules/jest-cli/node_modules/jest-resolve/src/index.js:117:17)
        at Object.<anonymous> (node_modules/react-native/Libraries/react-native/react-native.js:175:25)
        at Object.<anonymous> (node_modules/react-native-router-flux/src/Scene.js:10:18)

虽然我可以解决这个问题,但我很想知道失败的原因, 另请注意,我无法在react-native-router-flux文件中使用es2015预设转换.bablerc,我认为我将不得不忍受这种限制(无法转换反应原生-router通量)。

myActions.js看起来像

import {Actions} from 'react-native-router-flux';
export function searchRequest() {
    return {
        type: "search_request"
    }
}

export function searchRequestFailure(error) {
    return {
        type: "search_request_failure",
        error: error.toString()
    }
}

export function searchRequestSuccess(payload) {
    return {
        type: "search_request_success",
        payload: payload
    }
}

export function search(nameOrAddress) {
    return dispatch => {
        dispatch(searchRequest())
        return fetch("http://localhost:8080/search", {
            method: "GET"
        }).then((response) => {
            return response.json()
        }).then((responseData) => {
            dispatch(searchRequestSuccess(responseData))
            Actions.list() //react-native-router-flux dependency
        }).catch(error =>  {
            dispatch(searchRequestFailure(error))
        })
    }
}

使用react-native 0.26和jest 12.1.1

1 个答案:

答案 0 :(得分:1)

这不是正确的ES6转换。

const actions = require('../myActions'); // requires the defaultMember of the exported module and

//ES6 (ES2015) equivalent is 
import actions from '../myActions';

https://developer.mozilla.org/en/docs/web/javascript/reference/statements/import