O problema
Estou escrevendo testes unitários para um microserviço feito com TypeScript, testando funções que buscam dados no banco de dados, removem determinadas propriedades do objeto e o retorna para o cliente. Preciso ter certeza de que os dados estão sendo removidos, e para não reescrever todo o payload no meu arquivo de testes exceto pelas propriedades removidas, busquei uma solução mais simples.
Exemplo
// Função a ser testada
function fetchFromDatabase() {
const payload = {
id: 1,
name: 'Vitor',
secret: 'My secret'
}
delete payload.secret
return payload
}
...
// Arquivo de teste (usando o chai, mas poderia ser qualquer lib de testes)
function testMyFunction() {
const mock = {
id: 1,
name: 'Vitor',
secret: 'My secret'
}
insertIntoDatabase(mock) // Exemplo adicionando um mock no banco de dados
const result = fetchFromDatabase()
const { secret, ...allowedProperties } = mock // Onde a mágica acontece.
expect(result).to.be.eql(allowedProperties) // returns: true
}
O que aconteceu?
Usamos o destructuring para selecionar as propriedades que não queremos, e com o spread operator (...
) salvamos todo o resto (propriedades que queremos) dentro de allowedProperties
.
E o delete
?
Na função que é testada é usada a keyword delete
, mas poderia ser facilmente substituída pela nossa "técnica" de destructuring + spread operator.
No JavaScript temos a keyword delete
, que remove uma propriedade de um objeto.
const obj = { name: 'Vitor', role: 'Developer' }
delete obj.role
console.log(obj) // { name: 'Vitor' }
Entretanto, como podemos ver, ao usarmos o delete
o nosso objeto é mutado. Particularmente, não é um comportamento que gosto de manter na minha base de código, pois pode dificultar os meus testes e criar side effects difíceis de debugar.
Top comments (0)