2017-08-18 2 views
1

Ich verwende nock, um meine HTTP-Anfragen in einer mocha/chai Umgebung abzufangen. Auch verwende ich supertest und supertest-chai, um meinen eigenen express Server abzufragen. So:nock: Antwort ist keine Funktion

importieren {it} aus 'mocha'; Import Chai, {sollte} von '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 }); 
}); 

Wenn ich meine Tests laufen, werfen der erste Anruf von itRespondsTo wird immer einen Fehler:

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

TypeError: nock.reply is not a function

Und es wird immer der erste Aufruf von itRespondsTo sein. Wenn ich den ersten Anruf entferne, wird der nächste Anruf den Fehler usw. auslösen. Ich habe keine Ahnung, warum das passiert.

Antwort

1

Ich habe den Grund gefunden, dass ich einen Fehler bekommen habe. Ich musste eine get dazwischen setzen:

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