2016-04-04 55 views
0

我花了几个小时来搜索一个库来模拟nodejs中的外部API。我已经尝试过SinonJS库,但它似乎不适用于外部网络调用...有没有人知道另一个允许嘲笑外部网络调用的库?或者有人对SinonJS有一个可行的例子吗?在NodeJs中嘲弄外部API进行单元测试

谢谢你的每一个答案!

下面你可以找到我的代码。

我的单元测试与SinonJS:

import expect from 'expect'; 
import { searchForProducts } from 'api/ProductAPI'; 
import emptyResults from 'api/ProductAPI_EmptyResult.json'; 

describe('ProductAPI',() => { 
    let server; 

    before(function() { 
    server = sinon.fakeServer.create(); 
    server.respondWith(
     "GET", 
     "https://my.domain.com/myresource", 
     [200, { "Content-Type": "application/json" }, JSON.stringify(emptyResults)] 
    ); 
    }); 

    it('product search with working API ',() => { 

    server.respond(); 

    searchForProducts('tv').then(
     (data) => { 
     console.log('success'); 
     }, 
     (error) => { 
     console.log('error'); 
     }); 

    //dummy expect 
    expect(
     'test' 
    ).toEqual('test'); 

    }); 
}); 

ProductAPI:

import restClient from './RestClient'; 

/** 
* 
* Returns a list of products 
* @param query 
* @returns {ProductDTOs} 
*/ 
function _searchForProducts(query) { 
    return restClient().get(
    `/myresource` 
); 
} 

RESTClient实现(与爱可信):

import Axios from 'axios'; 

const restClient = function restClient() { 
    let axios; 
    let apiUrl; 

    function _url(url) { 
    return `${apiUrl}${url}`; 
    } 

    function _get(url) { 
    return axios({ 
     method: 'GET', 
     url: _url(url), 
    }); 
    } 

    function _post(url, data) { 
    return axios({ 
     method: 'POST', 
     url: _url(url), data, 
    }); 
    } 

    function _put(url, data) { 
    return axios({ 
     method: 'PUT', 
     url: _url(url), data, 
    }); 
    } 

    function _patch(url, data) { 
    return axios({ 
     method: 'PATCH', 
     url: _url(url), 
     data, 
    }); 
    } 

    function _delete(url, data) { 
    return axios({ 
     method: 'DELETE', 
     url: _url(url), data, 
    }); 
    } 

    function _setDefaultHeaders() { 
    axios.defaults.headers.post['Content-Type'] = 'application/json'; 
    axios.defaults.headers.common['Accept'] = 'application/json'; 
    } 

    function _setAuthorizationHeader(token) { 
    axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; 
    } 

    function _removeAuthorizationHeader() { 
    axios.defaults.headers.common['Authorization'] = ''; 
    } 

    function _setup() { 
    axios = Axios; 
    apiUrl = 'https://my.domain.com'; 

    _setDefaultHeaders(); 
    } 

    _setup(); 

    return { 
    setup: _setup, 
    url: _url, 
    get: _get, 
    post: _post, 
    put: _put, 
    patch: _patch, 
    delete: _delete, 
    setDefaultHeaders: _setDefaultHeaders, 
    setAuthorizationHeader: _setAuthorizationHeader, 
    removeAuthorizationHeader: _removeAuthorizationHeader, 
    }; 
}; 

export default restClient; 
+0

什么不起作用?显示你的代码。 'sinon'可以做你需要的一切。 – alexmac

+0

嗨,亚历山大,我现在添加了我的代码。问题是我没有收到我的假服务器的任何回应 – user3836726

回答

0

我发现我的问题我忘记了一些服务器配置。为了使服务器运行,我必须将autoRespond属性设置为true:

before(function() { 
    server = sinon.fakeServer.create(); 
    server.respondWith(
     "GET", 
     "https://ec2-52-58-48-214.eu-central-1.compute.amazonaws.com/mspocc/v2/msp/products/search?query=tv&fields=FULL", 
     [200, { "Content-Type": "application/json" }, JSON.stringify(emptyResults)] 
    ); 
    server.autoRespond = true 
    }); 
0

使用兴农间谍功能或任何其他测试套件像茉莉花应该是嘲笑外部电话的适当方式。

+0

谢谢你的回答。有可能与间谍创造承诺吗?因为ProductAPI中的_searchForProducts正在返回一个承诺。对于我来说,它看起来有点复杂... – user3836726

+0

是的,你可以伪造一个承诺: spyOn(Contact,'retrieveContactInfo').callFake(function(){ return:{function} {callback} {return callback(user);} }; }); –