2016-04-04 5 views
0

Ich verbringe jetzt einige Stunden für das Durchsuchen einer Bibliothek für Spott eine externe API in Nodejs. Ich habe bereits die SinonJS-Bibliothek ausprobiert, aber es scheint nicht für externe Web-Anrufe zu funktionieren ... Kennt jemand eine andere Bibliothek, die das Spotten externer Web-Anrufe erlaubt? Oder hat jemand ein funktionierendes Beispiel für SinonJS?Mocking externe API für Komponententests in NodeJs

Vielen Dank für jede Antwort!

Unten finden Sie meinen Code.

My Unit Test mit 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 (mit Axios):

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

Was funktioniert nicht? Zeigen Sie Ihren Code. 'sinon' kann alles tun was du brauchst. – alexmac

+0

Hallo Alexander, ich habe jetzt meinen Code hinzugefügt. Das Problem ist, dass ich keine Antwort von meinem falschen Server – user3836726

Antwort

0

Ich fand mein Problem Ich habe einige Serverkonfigurationen vergessen. Um den Server laufen zu lassen, musste ich das autoRespond-Attribut auf true setzen:

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

Mit Spione Funktionalität in sinon oder andere Testsuite wie Jasmin sollte der geeignete Weg sein, externe Anrufe zu verspotten.

+0

bekomme Vielen Dank für die Antwort. Ist es möglich, mit Spionen Versprechungen zu machen? weil die _searchForProducts in ProductAPI eine Zusage zurückgibt. Für mich sieht es ein wenig kompliziert aus ... – user3836726

+0

Ja, Sie können ein Versprechen fälschen: spyOn (Kontakt, 'retrieveContactInfo') .und.callFake (function() { Rückgabe { dann: function (callback) {return Rückruf (Benutzer);} }; }); –