2017-08-18 4 views
1

J'utilise nock pour intercepter mes requêtes http dans un environnement mocha/chai. Aussi j'utilise supertest et supertest-chai pour interroger mon propre serveur express. Comme ceci:nock: réponse n'est pas une fonction

import {it} de 'mocha'; import chai, {should} de 'chai';

import request from 'supertest'; 
import supertestChai from 'supertest-chai'; 
import Joi from 'joi'; 
import chaiJoi from 'chai-joi'; 
// others 

function itRespondsTo({ url, response, description, parameters = {} }) { 
    const maxAge = parameters.maxAge || serverConfig.defaultCacheAge; 
    const params = parameters ? `${Object.entries(parameters).map(([name, val]) => `&${name}=${val}`).join('&')}` : ''; 
    const path = `/oembed?url=${encodeURIComponent(url)}${params}`; 
    const desc = description || `/oembed?url=${url}${params}`; 
    it(`should respond to ${desc}`, (done) => { 
    request(server) 
     .get(path) 
     .expect(200) 
     .expect('Content-Type', /json/) 
     .expect('Access-Control-Allow-Methods', 'GET') 
     .expect('Cache-Control', `public, max-age=${maxAge}`) 
     .expect(res => Object.values(OEMBED_TYPES).should.include(res.body.type)) // [1] 
     .expect(res => Joi.validate(res.body, OEMBED_SCHEMAS[res.body.type]).should.validate) 
     .expect(response) 
     .end(done); 
    }); 
} 

describe('YouTube endpoint',() => { 
    beforeEach(() => { 
    nock(/youtube\.com/) 
     .reply(200, remoteResponse); 
    }); 

    afterEach(() => { 
    nock.restore(); 
    }); 

    itRespondsTo({ url: 'https://youtu.be/m4hklkGvTGQ', response }); 
    itRespondsTo({ url: 'https://www.youtube.com/embed/m4hklkGvTGQ', response }); 
    itRespondsTo({ url: 'https://www.youtube.com/watch?v=m4hklkGvTGQ', response }); 
    itRespondsTo({ url: 'https://www.youtube.com/?v=m4hklkGvTGQ', response }); 
}); 

Quand je lance mes tests, le premier appel de itRespondsTo aura toujours une erreur est générée:

1) YouTube endpoint "before each" hook for "should respond to /oembed?url= https://youtu.be/m4hklkGvTGQ ":

TypeError: nock.reply is not a function

Et ce sera toujours le premier appel de itRespondsTo. Si je supprime le premier appel, l'appel suivant va lancer l'erreur et ainsi de suite. Je n'ai aucune idée de pourquoi cela se passe.

Répondre

1

J'ai trouvé la raison pour laquelle j'ai eu une erreur. Je devais mettre un get entre:

nock('https://www.youtube.com') 
    .get('/oembed') 
    .query(true) 
    .reply(200, remoteResponse);