我想做的是对Firebase云功能进行单元测试。为此,我遵循this存储库中描述的步骤。被测函数看起来如下(我已经简化了):
validate_keypad_code.js
const functions = require('firebase-functions');
const { isRequestAuthorized } = require('../../services/authorization-service');
const { validateKeypadCode } = require('../../services/code-validation-service');
const { updateDeviceInputResource } = require('../../services/devices-gateway-service');
const { ERROR_MESSAGES,CUSTOM_HEADERS } = require('../../constants');
exports = module.exports = functions.https.onRequest((request,response) => {
if(!isRequestAuthorized(request))
return response.status(401).send(ERROR_MESSAGES.UNAUTHORIZED);
return validateKeypadCode("myDevice",223344).then(function(isvalid){
if(isvalid)
updateDeviceInputResource("account1","myDevice","resource1");
return response.status(200).send();
});
});
code_validation_service.js
async function validateKeypadCode(id,input) {
// Makes some calls to services hosted on the internet
}
module.exports = {
validateKeypadCode
};
device_gateway_service.js
function updateDeviceInputResource(id,devId,resId) {
// Makes some calls to services hosted on the internet
}
module.exports = {
updateDeviceInputResource
};
-
我要在这里测试的是:
-
没有有效的授权标头时,返回
- 401
- 当validateKeypadCode返回isValid = true =>时,请验证一次 updateDeviceInputResource是否被调用
- 当validateKeypadCode返回isValid = false =>时,确认未调用 updateDeviceInputResource 已发送
- 200 个回复
第一个测试已经准备就绪,我是这样实现的:
validate_keypad_code.spec.js
const chai = require('chai');
const assert = chai.assert;
const sinon = require('sinon');
const admin = require('firebase-admin');
const test = require('firebase-functions-test')();
const { ERROR_MESSAGES } = require('../../../../constants')
describe('Cloud functions',() => {
let myFunctions;
let authorizationHeaderValue = "798205486e954fa880a0b366e6725f71"
before(() => {
test.mockConfig({ authorization: { header: authorizationHeaderValue }});
myFunctions = require('../../../../index');
});
after(() => {
test.cleanup();
});
it('should return a 401 unauthorized',(done) => {
const req = {
body: {},get: () => ''
};
const res = {
status: (code) => {
assert.equal(code,401);
return {
send: (responseMessage) => {
assert.equal(responseMessage,ERROR_MESSAGES.UNAUTHORIZED);
done();
}
}
}
};
myFunctions.validate_keypad_code(req,res);
});
});
})
我现在的目标是使用 sinon 存根服务依赖项并配置我的测试:
it('should update device input resource when keypad code is valid',(done) => {
// Mock validateKeypadCode and updateDeviceInputResource
// Assert
done();
});
我尝试结合使用this方法和消除云功能中的破坏。
替换为:
// ...
const { validateKeypadCodeForMailbox } = require('../../services/code-validation-service');
const { updateDeviceInputResource } = require('../../services/devices-gateway-service');
// ...
exports = module.exports = functions.https.onRequest((request,response) => {
// ...
return validateKeypadCodeForMailbox(/* ... */).then(function(isvalid){
if(isvalid)
updateDeviceInputResource(/* ... */);
// ...
});
与此:
// ...
const codeValidationService = require('../../services/code-validation-service');
const deviceGatewayService = require('../../services/devices-gateway-service');
// ...
exports = module.exports = functions.https.onRequest((request,response) => {
// ...
return codeValidationService.validateKeypadCodeForMailbox(/* ... */).then(function(isvalid){
if(isvalid)
deviceGatewayService.updateDeviceInputResource(/* ... */);
// ...
});
然后,在我的测试中:
it('should update device input resource when keypad code is valid',(done) => {
const validateKeypadCodeStub = sinon.stub();
sinon.stub(codeValidationService,'validateKeypadCode').callsFake(validateKeypadCodeStub);
done();
});
我收到以下错误:
ReferenceError:未定义codeValidationService 在Context.it(test / offline-unit-tests /...)