【问题标题】:How to mock request-promise-native for NodeJS unit testing?如何模拟 NodeJS 单元测试的 request-promise-native?
【发布时间】:2017-10-09 21:58:44
【问题描述】:

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

使用 Mockery(根据文档 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 和 sinon 的假服务器的变体。但我无法让它们工作。

有什么建议吗?

【问题讨论】:

    标签: node.js unit-testing sinon ava


    【解决方案1】:

    通常如果在导入的包上使用 sinon spy,你会像 sinon.spy(request.prototype, 'get') 这样创建存根。这在这里不起作用,大概是因为 request 没有在原型上定义方法。您可以解决此问题的一种方法是在实例上创建存根(如果您可以这样称呼它)。示例如下:

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

    【讨论】:

    • 谢谢@ElioRubens。我对你的建议做了些许改动。从 NodeJS 文件中导出 myRequest,在测试文件中导入。然后将其存根:sinon.stub(myRequest, 'post').returns(response)。它有效。
    • @Canton,谢谢,很高兴它会有所帮助。如果您认为它回答了问题,请将其标记为已接受的答案会很有帮助。
    【解决方案2】:

    我为此使用了 proxyquire。这是我用来模拟 request-promise 的一些代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2016-09-30
      • 2018-04-02
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多