【问题标题】:Firebase sinon / chai unit testing in nodeJSnodeJS中的Firebase sinon / chai单元测试
【发布时间】:2020-06-20 03:15:02
【问题描述】:

尝试为我的 Firebase 项目进行离线单元测试。我似乎无法弄清楚为什么以下测试没有运行并记录 console.log('b') & ('c')。我假设我错误地存根它,但无法弄清楚。通过测试输出和console.log,它只返回'a',然后也返回true。

帮助表示赞赏。

index.js

function createFreeAgents(admin) {
    admin.database().ref('/CONFIG').update({ 
        "agencyActive" : false,
        "listCount" : true
    });
    **console.log('a')**
    admin.database().ref('/FREEAGENTPICK').once('value', snap => {
        **console.log('b')**
        snap.forEach(team => {
            **console.log('c')**
            let newAgentObject = {
                "rookie": 2,
                "senior": 4,
            }

            admin.database().ref('/FREEAGENTPICK/' + team.key).update(newAgentObject);
        })
    })

    return true;
}
const chai = require('chai');
const expect = chai.expect;
const assert = chai.assert;

const sinon = require('sinon');
const admin = require('firebase-admin');
const test = require('firebase-functions-test')();
const functions = require('../index');

describe('it should update a players score', () => {
    let adminInitStub, adminDatabaseStub;

    beforeEach(() => {            
        adminInitStub = sinon.stub(admin, 'initializeApp');
        adminDatabaseStub = sinon.stub(admin, 'database');
    });

    afterEach(() => {
        adminInitStub.restore();
        test.cleanup();
    });

    describe('run createFreeAgent()', () => {  
        it('should run createFreeAgents() and return true', () => {  
            // Stubs
            databaseStub = sinon.stub();
            refStub = sinon.stub();
            updateStub = sinon.stub();

            // Values
            configUpdate = { 
                "agencyActive" : false,
                "listCount" : true
            };

            // DBMocks
            adminDatabaseStub = Object.defineProperty(admin, 'database', { get: () => databaseStub });
            databaseStub.returns({ ref: refStub }); 

            refStub
                .withArgs('/CONFIG')
                .onFirstCall()
                .returns({ update: updateStub })
                .withArgs('/FREEAGENTPICK')
                .onFirstCall()
                .returns({ once: updateStub })

            updateStub
                .onFirstCall()
                .returns(configUpdate)
                .onSecondCall()
                .returns(snapFreeAgent)

            assert.deepEqual(updateStub('/CONFIG'), configUpdate);

            result = functions.createFreeAgents(adminDatabaseStub);
            expect(result).to.equal(true);

            return;
        })
    })    
})
test output

  it should update a players score
    run createFreeAgent()
a
      √ should run createFreeAgents() and return true


  1 passing (13ms)

【问题讨论】:

    标签: firebase unit-testing firebase-realtime-database chai sinon


    【解决方案1】:

    免责声明:我没有对此进行测试(因为依赖太多)。

    这个想法是:你不能对方法 updateonce 使用相同的 updateStub,因为它们有不同的实现(更新只需要1个参数,而一次需要2个参数)。您可以将 updateStub for once 方法更改为简单的 fake(但如果您仍想使用存根,也可以),以便运行 console.log b 和 c。

    示例:使用假实现

    const onceFake = sinon.fake((arg1, arg2) => {
      // arg1: will contain string 'value' => based on your sample code.
      // arg2: will contain function.
      // Then you need to call arg2 with injected value.
      arg2(configUpdate); // This is where console.log b and c will get called.
    });
    

    别忘了改.returns({ once: updateStub })

    .returns({ once: onceFake }).

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 2018-11-05
      • 2019-02-03
      • 2021-03-08
      • 2017-10-08
      • 1970-01-01
      • 2023-03-10
      • 2019-02-14
      相关资源
      最近更新 更多