Модульное тестирование Firebase sinon / chai в nodeJS - PullRequest
0 голосов
/ 20 июня 2020

Пытаюсь запустить автономное модульное тестирование для моего проекта 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)

1 Ответ

0 голосов
/ 27 июня 2020

Заявление об отказе от ответственности: я не тестировал это (из-за слишком большой зависимости).

Идея такова: вы не можете использовать тот же updateStub для метода update и once , потому что они имеют другую реализацию ( update нужен только 1 аргумент, а once требуется 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 }).

...