Estoy tratando de stub el siguiente código
async function logUpdate(client) { const results = await client.query(query.toParam()); const { count, timestamp } = results.rows[0]; await db.updateDatasourceLogs(destdb, DB.src, TABLES.src, timestamp, count); }Este es el siguiente código que estoy usando para cerrar el código anterior
fakeClient = { query: sinon.stub().resolves(fakeRows), }; const rowData = { count: 1, timestamp: '' }; fakeRows = { rows: sinon.stub().returns([rowData]), }; fakeSequel = { useFlavour: sinon.stub().returns(toParam: () => false,), };Recibo un error de desestructuración
TypeError: no se puede desestructurar el count de propiedades de 'indefinido' o 'nulo'.
en línea
const { count, timestamp } = results.rows[0];¿Cómo cortar la línea anterior?
Si observamos el cuerpo de su función logUpdate , vemos que comienza con las siguientes dos líneas:
const results = await client.query(query.toParam()); const { count, timestamp } = results.rows[0];Este código dice:
client.query y asígnela a una variable llamada results .results es un objeto con una propiedad llamada rows que es una matriz cuyo elemento 0 debe ser un objeto con propiedades de count y timestamp de tiempo, que desestructuramos en variables locales.Esto implica que el valor de los resultados se parece a:
{ "rows": [ { "count": 1 "timestamp": "0" } ] }Sin embargo, en nuestro código de creación de apéndices, tenemos lo siguiente:
fakeRows = { rows: sinon.stub().returns([rowData]), }; Lo que dice que fakeRows es un objeto con una propiedad de rows cuyo valor es una función que devuelve [rowData] .
Si tuviéramos que implementar este Objeto sin sinon, se vería así:
{ "rows": function () { return [ { "count": 1 "timestamp": "0" } ]; } } Observe la diferencia entre la estructura que espera logUpdate y lo que realmente proporciona fakeRows . Específicamente, logUpdate espera que los results tengan una matriz de rows , pero, con nuestro código auxiliar, ¡tiene una función de rows !
Podemos arreglar esto simplemente haciendo que fakeRows referencia a nuestros datos de rowData directamente:
const fakeRows = { rows: [rowData] };