gpt4 book ai didi

node.js - 如何为 NodeJS 单元测试模拟 request-promise-native?

转载 作者:搜寻专家 更新时间:2023-10-31 23:23:27 27 4
gpt4 key购买 nike

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

使用 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 的假服务器。但我无法让它们工作。

有什么建议吗?

最佳答案

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

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

关于node.js - 如何为 NodeJS 单元测试模拟 request-promise-native?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com