Node.js - 承诺的模拟结果
Node.js - Mock result of a promise
我想模拟节点模块中函数的结果,以便我可以 运行 断言。
考虑以下节点模块:
const doPostRequest = require('./doPostRequest.js').doPostRequest;
const normalizeSucessResult = require('./normalizer.js').normalizeSucessResult;
const normalizeErrorResult = require('./normalizer.js').normalizeErrorResult;
exports.doPost = (params, postData) => {
return doPostRequest(params, postData).then((res) => {
const normalizedSuccessResult = normalizeSucessResult(res);
return normalizedSuccessResult;
}).catch((err) => {
const normalizedErrorResult = normalizeErrorResult(err);
return normalizedErrorResult;
})
}
函数 doPostRequest
return 是一个承诺。我如何伪造此承诺的 return 值,以便我可以断言 normalizeSucessResult
是否已被调用?
所以因为我已经尝试过:
const normalizeSucessResult = require('./normalizer.js');
const doPostRequest = require('./doPostRequests.js');
const doPost = require('./doPost.js');
it('runs a happy flow scenario', async () => {
let normalizeSucessResultStub = sinon.stub(normalizeSucessResult, 'normalizeSucessResult');
let postData = { body: 'Lorum ipsum' };
let params = { host: 'someUrl', port: 433, method: 'POST', path: '/' };
sinon.stub(doPostRequest, 'doPostRequest').resolves("some response data"); //Fake response from doPostRequest
return doPost.doPost(params, postData).then((res) => { //res should be equal to some response data
expect(normalizeSucessResultStub).to.have.been.calledOnce;
expect(normalizeSucessResultStub).to.have.been.with("some response data");
});
});
doPostRequest
模块如下所示:
const https = require('https')
module.exports.doPostRequest = function (params, postData) {
return new Promise((resolve, reject) => {
const req = https.request(params, (res) => {
let body = []
res.on('data', (chunk) => {
body.push(chunk)
})
res.on('end', () => {
try {
body = JSON.parse(Buffer.concat(body).toString())
} catch (e) {
reject(e)
}
resolve(body)
})
})
req.on('error', (err) => {
reject(err)
})
if (postData) {
req.write(JSON.stringify(postData))
}
req.end()
})
}
您可以使用 Promise.resolve 到 return 具有任何给定值的承诺。
Promise.resolve(“hello world”);
为了存根你的函数你需要这样做
sinon.stub({doPostRequest}, 'doPostRequest').resolves("some response data")
好的,我明白了。函数 doPostRequest
使用 require
加载,在文件顶部使用 const doPostRequest = require('./doPostRequest.js').doPostRequest;
为了模拟从使用 require
加载的函数返回的数据,我不得不使用一个名为 mock-require. There are more modules that can take care of this (proxyquire 的节点模块,这是一个流行的模块)但我选择了 mock-require (我没有选择 mock-require 的具体原因)。
对于遇到类似问题的任何其他人,请尝试 mock-require 模拟使用 require
.
加载的文件的响应
我想模拟节点模块中函数的结果,以便我可以 运行 断言。 考虑以下节点模块:
const doPostRequest = require('./doPostRequest.js').doPostRequest;
const normalizeSucessResult = require('./normalizer.js').normalizeSucessResult;
const normalizeErrorResult = require('./normalizer.js').normalizeErrorResult;
exports.doPost = (params, postData) => {
return doPostRequest(params, postData).then((res) => {
const normalizedSuccessResult = normalizeSucessResult(res);
return normalizedSuccessResult;
}).catch((err) => {
const normalizedErrorResult = normalizeErrorResult(err);
return normalizedErrorResult;
})
}
函数 doPostRequest
return 是一个承诺。我如何伪造此承诺的 return 值,以便我可以断言 normalizeSucessResult
是否已被调用?
所以因为我已经尝试过:
const normalizeSucessResult = require('./normalizer.js');
const doPostRequest = require('./doPostRequests.js');
const doPost = require('./doPost.js');
it('runs a happy flow scenario', async () => {
let normalizeSucessResultStub = sinon.stub(normalizeSucessResult, 'normalizeSucessResult');
let postData = { body: 'Lorum ipsum' };
let params = { host: 'someUrl', port: 433, method: 'POST', path: '/' };
sinon.stub(doPostRequest, 'doPostRequest').resolves("some response data"); //Fake response from doPostRequest
return doPost.doPost(params, postData).then((res) => { //res should be equal to some response data
expect(normalizeSucessResultStub).to.have.been.calledOnce;
expect(normalizeSucessResultStub).to.have.been.with("some response data");
});
});
doPostRequest
模块如下所示:
const https = require('https')
module.exports.doPostRequest = function (params, postData) {
return new Promise((resolve, reject) => {
const req = https.request(params, (res) => {
let body = []
res.on('data', (chunk) => {
body.push(chunk)
})
res.on('end', () => {
try {
body = JSON.parse(Buffer.concat(body).toString())
} catch (e) {
reject(e)
}
resolve(body)
})
})
req.on('error', (err) => {
reject(err)
})
if (postData) {
req.write(JSON.stringify(postData))
}
req.end()
})
}
您可以使用 Promise.resolve 到 return 具有任何给定值的承诺。
Promise.resolve(“hello world”);
为了存根你的函数你需要这样做
sinon.stub({doPostRequest}, 'doPostRequest').resolves("some response data")
好的,我明白了。函数 doPostRequest
使用 require
加载,在文件顶部使用 const doPostRequest = require('./doPostRequest.js').doPostRequest;
为了模拟从使用 require
加载的函数返回的数据,我不得不使用一个名为 mock-require. There are more modules that can take care of this (proxyquire 的节点模块,这是一个流行的模块)但我选择了 mock-require (我没有选择 mock-require 的具体原因)。
对于遇到类似问题的任何其他人,请尝试 mock-require 模拟使用 require
.