Node JS单元测试-云函数,如何调用内部函数
Node JS unit test - cloud function, how to call to inner function
我正在使用 AVA 框架 (https://github.com/avajs/ava/blob/HEAD/docs/01-writing-tests.md)
在 GCP 上测试用 NodeJS 编写的 Cloud Function。
我正在尝试对我的云函数中的内部函数进行单元测试。
我的测试代码如下:
const test = require(`ava`);
const uuid = require(`uuid`);
const sinon = require(`sinon`);
const triggerResultsService = require(`..`).triggerResultsService;
const consoleLog = sinon.stub(console, 'log');
const sendToTransferService = require(`..`).triggerResultsService.sendToTransferService;
test('resolves with unicorn', t => {
const filename = uuid.v4();
sendToTransferService(filename, () =>{
});
return Promise().then(result => {
t.is(result, 'unicorn');
});
});
我的云功能代码如下:
/**
* Generic background Cloud Function to be triggered by Cloud Storage.
*
* @param {object} event The Cloud Functions event.
* @param {function} callback The callback function.
*/
var request = require("request");
exports.triggerResultsService = (event, callback) => {
var file = event.data;
var fileName = file.name.substr(file.name.lastIndexOf('/')).toLowerCase().trim();
if(!fileName.includes('temp-') && fileName.includes('.csv.gz')) {
console.log("file name is in correct location, sending options");
sendToTransferService(file);
sendStatusEmail("Transfer File Call successful");
};
callback();
};
function sendToTransferService(file) {
var options = {
method: 'POST',
uri: process.env.TRANSFER_SERVICE_URL,
body: {
fileName: file.name,
bucketName: file.bucket
},
json: true
};
return new Promise(function (resolve, reject) {
request(options, function (err, resp) {
if (err) {
console.log(err);
return reject({err: err});
}
return resolve({responsebody:resp.body});
});
});
}
function sendStatusEmail(statusMessage) {
var options = {
method: 'POST',
uri: process.env.EMAIL_NOTIFICATION_URL,
body: {
from: process.env.EMAIL_FROM,
to: [process.env.SLACK_EMAIL],
cc: [''],
bcc: [''],
subject: process.env.EMAIL_SUBJECT,
body: statusMessage
},
json: true
};
return new Promise(function (resolve, reject) {
request(options, function (err, resp) {
if (err) {
console.log(err);
return reject({err: err});
}
return resolve({responsebody:resp.body});
});
});
}
我无法访问函数 sendToTransferService 。
有什么想法我应该 require/declare
提前致谢
我认为最简单的方法是将该函数转换为它自己的模块,然后从那里导出。导入该模块的任何其他代码都可以访问它,包括您的 Cloud Functions 代码。
我正在使用 AVA 框架 (https://github.com/avajs/ava/blob/HEAD/docs/01-writing-tests.md) 在 GCP 上测试用 NodeJS 编写的 Cloud Function。 我正在尝试对我的云函数中的内部函数进行单元测试。
我的测试代码如下:
const test = require(`ava`);
const uuid = require(`uuid`);
const sinon = require(`sinon`);
const triggerResultsService = require(`..`).triggerResultsService;
const consoleLog = sinon.stub(console, 'log');
const sendToTransferService = require(`..`).triggerResultsService.sendToTransferService;
test('resolves with unicorn', t => {
const filename = uuid.v4();
sendToTransferService(filename, () =>{
});
return Promise().then(result => {
t.is(result, 'unicorn');
});
});
我的云功能代码如下:
/**
* Generic background Cloud Function to be triggered by Cloud Storage.
*
* @param {object} event The Cloud Functions event.
* @param {function} callback The callback function.
*/
var request = require("request");
exports.triggerResultsService = (event, callback) => {
var file = event.data;
var fileName = file.name.substr(file.name.lastIndexOf('/')).toLowerCase().trim();
if(!fileName.includes('temp-') && fileName.includes('.csv.gz')) {
console.log("file name is in correct location, sending options");
sendToTransferService(file);
sendStatusEmail("Transfer File Call successful");
};
callback();
};
function sendToTransferService(file) {
var options = {
method: 'POST',
uri: process.env.TRANSFER_SERVICE_URL,
body: {
fileName: file.name,
bucketName: file.bucket
},
json: true
};
return new Promise(function (resolve, reject) {
request(options, function (err, resp) {
if (err) {
console.log(err);
return reject({err: err});
}
return resolve({responsebody:resp.body});
});
});
}
function sendStatusEmail(statusMessage) {
var options = {
method: 'POST',
uri: process.env.EMAIL_NOTIFICATION_URL,
body: {
from: process.env.EMAIL_FROM,
to: [process.env.SLACK_EMAIL],
cc: [''],
bcc: [''],
subject: process.env.EMAIL_SUBJECT,
body: statusMessage
},
json: true
};
return new Promise(function (resolve, reject) {
request(options, function (err, resp) {
if (err) {
console.log(err);
return reject({err: err});
}
return resolve({responsebody:resp.body});
});
});
}
我无法访问函数 sendToTransferService 。 有什么想法我应该 require/declare
提前致谢
我认为最简单的方法是将该函数转换为它自己的模块,然后从那里导出。导入该模块的任何其他代码都可以访问它,包括您的 Cloud Functions 代码。