2017-10-09 173 views
0

我的NodeJS应用程序使用request-promise-native。如何模拟NodeJS单元测试的request-promise-native?

import request from 'request-promise-native' 
const https = require('https') 

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

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

我想模拟'获取'上述单元测试请求。但它仍然会实际调用并获得结果,而不会通过我的模拟对象调用。

我尝试了不同的变化,使用兴农:

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) 
}) 

使用嘲弄(每文档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) 
}) 

我自己也尝试proxyquire和兴农的假服务器的变化。但我无法让他们工作。

有什么建议吗?

回答

1

通常情况下,如果在导入的软件包上使用sinon spy,则会创建存根,如sinon.spy(request.prototype, 'get')。这在这里不起作用,大概是因为请求没有定义原型上的方法。解决这个问题的一种方法是在实例上创建存根(如果可以调用的话)。示例如下:

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

谢谢@ElioRubens。我对你的建议做了一些改动。从导入到测试文件中的NodeJS文件导出myRequest。然后stubbed:sinon.stub(myRequest,'post')。returns(response)。有用。 – Canton

+0

@Canton,谢谢,很高兴它可能会有所帮助。如果您觉得它回答了这个问题,将其标记为接受的答案会很有帮助。 – ElioRubens

0

我对此使用了proxyquire。以下是我用来模拟请求承诺的一些代码片段:

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(); 
    }