使用Jest-React Native

时间:2017-08-21 05:31:20

标签: reactjs react-native jestjs babel-jest

我有一个常用的api类,用于处理React Native中的api调用。它将进行调用并获取json / error并返回它。请参阅下面的代码。

// General api to acces data from web
import ApiConstants from './ApiConstants';
export default function api(path,params,method, sssid){

    let options;
        options = Object.assign({headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
        }},{ method: method }, params ? { body: JSON.stringify(params) } : null );


    return fetch(ApiConstants.BASE_URL+path, options).then( resp => {
        let json = resp.json();
        if (resp.ok) {
            return json;
        }
        return json.then(err => {
            throw err;
        }).then( json => json );
    });
}

但是,当我在测试文件夹中编写用于模拟api的jest测试。

test('Should login',() => {
    global.fetch = jest.fn(() => new Promise((resolve) => {
        resolve( { status: 201, json: () => (mock_data_login) });
    }));

    return Api(ApiConstants.LOGIN,{'un':'test1','pwd':'1234'},'post', null).then((data1)=>{

        expect(data1).toBeDefined();
        expect(data1.success).toEqual(true);
        expect(data1.message).toEqual('Login Success');
    });

});

它失败了:

  

TypeError:json.then不是函数

当我将fetch更改为更改时,测试通过:

 return fetch(ApiConstants.BASE_URL+path, options).then( resp => {
            let json = resp.json();
            return json
        });
    }

为什么会出现此类错误错误?我无法更改API模块,因为这将改变我的redux传奇代码。我该怎么办?

3 个答案:

答案 0 :(得分:1)

在你的代码中,json只是一个Object而不是Promise,因此未定义。这是你得到的抱怨,因为你试图使用undefined作为一个函数。问题不在测试中,而是在您的代码中出现了错误。请尝试以下方法。

return fetch(ApiConstants.BASE_URL+path, options)
        .then(resp => resp.json())
        .then( json => json)
        .catch((error) => error);
    });

答案 1 :(得分:1)

编辑:哦,只是看到你无法对发生错误的组件进行更改?

尝试转换 fetch ,如下所示:

return fetch(ApiConstants.BASE_URL+path, options)
.then(resp => {
  let json = resp.json();
  if (resp.ok) {
    return json;
  } else {
    throw Error(resp.error) // assuming you have some kind of error from endpoint?
  }
})
.then(/*handle your ok response*/)
.catch(/*handle your error response*/);

答案 2 :(得分:0)

我遇到了同样的问题,问题是您仅将response.json作为函数进行了模拟,但它应该是Promise,就像这样,

 global.fetch = jest.fn(() => new Promise((resolve) => {
    resolve( { status: 201, json: () => {
         return Promise.resolve(mock_data_login);
       } 
    });
}));

这将为您返回一个json函数的承诺。

希望这可以解决您的问题。