Я использую firebase admin
, и я пытаюсь написать некоторые модульные тесты для моего кода.
Поскольку в мою функцию введено admin
, я решил, что могу смоделировать очень простой объект, подобный этому:
admin = {
get auth () {
return {
updateUser: () => {
return true;
},
createUser: () => {
return true;
},
getUser: () => {
throw Error('no user');
}
};
}
};
Тогда в конкретном тесте я могу заглушить функции. Вот что я сделал до сих пор:
// stubbed functions
sinon.stub(admin, 'auth').get(() => () => ({
updateUser: () => ({ called: true }),
getUser: () => (userRecord),
createUser: () => ({ called: false })
}));
и они работают нормально (я вижу по моим журналам).
Однако в моем тесте я также хотел бы проверить, если createUser
был вызван вообще. Я думал, что смогу настроить шпиона на функцию createUser
, но пока я не могу заставить его работать.
Вот то, что я пытался (с кучей вариантов, всегда терпящих неудачу) :
it.only('should update a user', async () => {
const userRecord = mockData
sinon.stub(admin, 'auth').get(() => () => ({
updateUser: () => ({ called: true }),
getUser: () => (userRecord),
createUser: () => ({ called: false })
}));
const spy = sinon.spy(admin, 'auth', ['get']); // this is not working
const user = await upsertUser(data, firestore, admin);
expect(user).toEqual(data.userDataForAuth); // this one is ok
sinon.assert.calledOnce(spy.get); // this throws an error
});
бит кода, который я пытаюсь проверить (это upsert function
это:
// in my test exisiting user is not null (the stub `getUser` is returning a object
if (existingUser != null) {
try {
await admin.auth().updateUser(uid, userDataForAuth);
return userDataForAuth;
} catch (error) {
console.log('error', error);
throw Error('error updating user');
}
}
Я даже не уверен, что это лучший подход, счастливый изменить его, если есть лучший!