如何在Firebase云功能中存根依赖项

我想做的是对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
};
  1. 我要在这里测试的是:

      没有有效的授权标头时,返回
    1. 401
    2. 当validateKeypadCode返回isValid = true =>时,请验证一次 updateDeviceInputResource是否被调用
    3. 当validateKeypadCode返回isValid = false =>时,确认未调用 updateDeviceInputResource
    4. 已发送
    5. 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 /...)

zazaza4321 回答:如何在Firebase云功能中存根依赖项

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3133468.html

大家都在问