Node.js 如何为NodeJS单元测试模拟本机请求承诺?

Node.js 如何为NodeJS单元测试模拟本机请求承诺?,node.js,unit-testing,sinon,ava,Node.js,Unit Testing,Sinon,Ava,我的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 findResult

我的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
}
我试图模拟“获取”上述单元测试请求。但它仍然进行实际调用并获得结果,而不是通过我的模拟对象调用

我使用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)
})
使用模拟(根据文档)

我还尝试了proxyquire和sinon的假服务器的变体。但我无法让他们工作


有什么建议吗?

通常,如果在导入的软件包上使用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()

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

谢谢你@ElioRubens。我对你的建议做了一点改动。从NodeJS文件导出myRequest,并导入到测试文件中。然后存根:sinon.stub(myRequest,'post')。返回(response)。这很有效。@Canton,谢谢,很高兴它能有所帮助。如果你觉得它回答了这个问题,那么把它标记为被接受的答案会很有帮助。
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();
    }