如何模拟异步函数的 return 值?
How to mock return value of async function?
我正在尝试测试使用 'easy-soap-request' 库的函数。
我想模拟 'soapRequest' 函数返回的结果。
我试过 this 但没用,我一直从外部获取数据 API。
client.js
const soapRequest = require('easy-soap-request');
async function get_data(){
var response = await soapRequest(url, auth_headers) //this is what I want to mock
var result;
result = some_parsing_function(response); //this is what I want test
return result;
}
test.js
const client = require('../../client');
describe('get_data tests', () =>{
it('should test sth', function (done) {
var stubed = stub(client, 'soapRequest').returns('dummy value');
client.get_data().then((result) => {
//assertions
console.log(result) //result still has value from external service
done();
});
})
});
编辑:
所以我尝试按照其中一个答案的建议使用 sinon.fake()。
const client = require('../../client');
describe('get_data tests', () =>{
it('should test sth', function (done) {
var fake_soap = fake(async () => {
return 12345;
});
replace(cilent, 'soapRequest', fake_soap);
client.soapRequest().then((res) => {
console.log(res); // 12345
})
client.get_data().then((result) => {
//assertions
console.log(result) //still original value from external service
done();
});
})
});
这将做:
let asyncHandler = sinon.fake(async () => {});
更新:
我的错!我没有很好地理解这个问题。这是解决它的一种方法。此外,最好将外部依赖项与应用程序逻辑分开。所以,我添加了一个新文件来发出 soap 请求。然后,对测试请求进行存根变得容易。
肥皂-connector.js
const soapRequest = require('easy-soap-request');
exports.request = async function request(url, auth_headers) {
return soapRequest(url, auth_headers);
};
client.js
const soapConnector = require('./soap-connector');
async function get_data(){
var response = await soapConnector.request(url, auth_headers) //this is what I want to mock
var result;
result = some_parsing_function(response); //this is what I want test
return result;
}
test.js
const soapConnector = require('../../soap-connector');
const client = require('../../client');
describe('get_data tests', () =>{
it('should test sth', function (done) {
var stubed = stub(soapConnector, 'request').callsFake(async () => {
return 12345;
});
client.get_data().then((result) => {
//assertions
console.log(result) //result still has value from external service
done();
});
})
});
在源文件中,soapRequest
变量本身是一个函数不是命名导入(对象)所以不可能只依赖sinon.stub
.
如果看一下easy-soap-request
源代码,显然,它导出了一个函数https://github.com/circa10a/easy-soap-request/blob/master/index.js#L14
根据我的经验,对于这种情况,可以通过如下添加proxyquire
来解决。
const proxyquire = require('proxyquire');
const sinon = require('sinon');
// we mock `easy-soap-request` (the library name) by using `sinon.stub`
const client = proxyquire('../../client', { 'easy-soap-request': sinon.stub().returns('dummy value') })
describe('get_data tests', () =>{
it('should test sth', async () => { // use async/await for better code
const result = await client.get_data();
console.log(result); // dummy value
})
});
如果你不想用sinon
,你也可以这样做
const client = proxyquire('../../client', { 'easy-soap-request': () => 'dummy value' })
参考:
https://www.npmjs.com/package/proxyquire
希望对您有所帮助
我正在尝试测试使用 'easy-soap-request' 库的函数。 我想模拟 'soapRequest' 函数返回的结果。
我试过 this 但没用,我一直从外部获取数据 API。
client.js
const soapRequest = require('easy-soap-request');
async function get_data(){
var response = await soapRequest(url, auth_headers) //this is what I want to mock
var result;
result = some_parsing_function(response); //this is what I want test
return result;
}
test.js
const client = require('../../client');
describe('get_data tests', () =>{
it('should test sth', function (done) {
var stubed = stub(client, 'soapRequest').returns('dummy value');
client.get_data().then((result) => {
//assertions
console.log(result) //result still has value from external service
done();
});
})
});
编辑:
所以我尝试按照其中一个答案的建议使用 sinon.fake()。
const client = require('../../client');
describe('get_data tests', () =>{
it('should test sth', function (done) {
var fake_soap = fake(async () => {
return 12345;
});
replace(cilent, 'soapRequest', fake_soap);
client.soapRequest().then((res) => {
console.log(res); // 12345
})
client.get_data().then((result) => {
//assertions
console.log(result) //still original value from external service
done();
});
})
});
这将做:
let asyncHandler = sinon.fake(async () => {});
更新:
我的错!我没有很好地理解这个问题。这是解决它的一种方法。此外,最好将外部依赖项与应用程序逻辑分开。所以,我添加了一个新文件来发出 soap 请求。然后,对测试请求进行存根变得容易。
肥皂-connector.js
const soapRequest = require('easy-soap-request');
exports.request = async function request(url, auth_headers) {
return soapRequest(url, auth_headers);
};
client.js
const soapConnector = require('./soap-connector');
async function get_data(){
var response = await soapConnector.request(url, auth_headers) //this is what I want to mock
var result;
result = some_parsing_function(response); //this is what I want test
return result;
}
test.js
const soapConnector = require('../../soap-connector');
const client = require('../../client');
describe('get_data tests', () =>{
it('should test sth', function (done) {
var stubed = stub(soapConnector, 'request').callsFake(async () => {
return 12345;
});
client.get_data().then((result) => {
//assertions
console.log(result) //result still has value from external service
done();
});
})
});
在源文件中,soapRequest
变量本身是一个函数不是命名导入(对象)所以不可能只依赖sinon.stub
.
如果看一下easy-soap-request
源代码,显然,它导出了一个函数https://github.com/circa10a/easy-soap-request/blob/master/index.js#L14
根据我的经验,对于这种情况,可以通过如下添加proxyquire
来解决。
const proxyquire = require('proxyquire');
const sinon = require('sinon');
// we mock `easy-soap-request` (the library name) by using `sinon.stub`
const client = proxyquire('../../client', { 'easy-soap-request': sinon.stub().returns('dummy value') })
describe('get_data tests', () =>{
it('should test sth', async () => { // use async/await for better code
const result = await client.get_data();
console.log(result); // dummy value
})
});
如果你不想用sinon
,你也可以这样做
const client = proxyquire('../../client', { 'easy-soap-request': () => 'dummy value' })
参考:
https://www.npmjs.com/package/proxyquire
希望对您有所帮助