2017-10-09 7 views
0

Mon application NodeJS utilise request-promise-native. J'essaie de me moquer de la demande de tests unitaires ci-dessus. Mais il fait toujours l'appel réel et obtient les résultats, ne passant pas par mon appel d'objet simulé.Comment se moquer de request-promise-native pour les tests unitaires NodeJS?

J'ai essayé différentes variantes, en utilisant Sinon:

import test from 'ava' 
import sinon from 'sinon' 
import Bluebird from 'bluebird' 
import request from 'request-promise-native' 
import { findResults } from '../services/results' 

test.only(async t => { 
    let response = JSON.stringify({ 
    statusCode: 504 
    }) 

    sinon.stub(request, 'get').returns(Bluebird.resolve(response)) 

    const returnValue = await findResults() 
    console.log('return: ', returnValue) 

    t.is (1, 1) 
}) 

En utilisant Moquerie (par la documentation https://www.npmjs.com/package/request-promise)

import mockery from 'mockery' 
import { findResults } from '../services/results' 

test.before(async t => { 
    mockery.enable({ 
     warnOnReplace: false, 
     warnOnUnregistered: false, 
     useCleanCache: true 
    }) 

    mockery.registerMock('request-promise-native', function() { 
    // var response = fs.readFileSync(__dirname + '/data/' + filename, 'utf8'); 
    let response = JSON.stringify({ 
     statusCode: 9 
    }) 
    return Bluebird.resolve(response.trim()); 
    }) 
}) 

test.after(async t => { 
    mockery.disable() 
    mockery.deregisterAll() 
    // done() 
}) 

test.only(async t => { 
    const returnValue = await findResults() 
    console.log('return: ', returnValue) 

    t.is(1, 1) 
}) 

J'ai aussi essayé des variations de proxyquire et faux serveur de sinon. Mais je ne pouvais pas les faire travailler.

Des suggestions?

Répondre

1

Normalement, si vous utilisez l'espion Sinon sur un paquet importé, vous créez le bout comme sinon.spy(request.prototype, 'get'). Cela ne fonctionne pas ici, probablement parce que la demande ne définit pas les méthodes sur le prototype. Une façon de contourner ce problème est de faire le stub sur l'instance (si vous pouvez l'appeler ainsi). Exemple ci-dessous:

const request = require('request-promise-native') 
const https = require('https') 
const {expect} = require('chai') 
require('mocha') 
const sinon = require('sinon') 
const Bluebird = require('bluebird') 

const myRequest = request.defaults({ 
    baseUrl: 'myBaseUrl', 
    agent: new https.Agent({ keepAlive: true }) 
}) 

async function findResults() { 
    const myResponse = await myRequest.get({ 
     uri: '/myUri' 
    }) 
    return myResponse 
} 



async function mainTest() { 
    let response = JSON.stringify({ 
    statusCode: 504 
    }) 
    sinon.stub(myRequest, 'get').callsFake((params) => Bluebird.resolve(response)) 
    const returnValue = await findResults() 
    console.log('return: ', returnValue) 
} 

mainTest() 
+0

Merci @ElioRubens. J'ai fait une légère variation à votre suggestion. Exporter myRequest du fichier NodeJS, importé dans le fichier de test. Puis l'a écrasé: sinon.stub (myRequest, 'post'). Renvoie (réponse). Ça marche. – Canton

+0

@Canton, merci, heureux qu'il pourrait être utile. Si vous pensez que cela a répondu à la question, il serait utile de la marquer comme la réponse acceptée. – ElioRubens

0

J'ai utilisé proxyquire pour cela. Voici quelques morceaux de code que j'ai utilisé pour simuler la demande-promesse:

const proxyquire = require('proxyquire'); 
before(function (done) { 

     rpMock = function() { 
      var response = generateFakeResponse(); 
      return Bluebird.resolve(response.trim()); 
     }; 

     done(); 
    }); 

    // actual test: 
    it('tests my function', function() { 
     let MyModule = proxyquire('./MyModule',{'request-promise':rpMock}); 
     let myModuleObj = new MyModule(); 
    }