Ligando os motores
Nessa página, vamos começar a usar o Mongoose. Este livro foi criado para um curso na Udemy, sendo assim, o mesmo deve ser usado em junção com o curso, para maior desempenho.
Nessa página, vamos começar a usar o Mongoose. Mongoose, de forma bem simples, é uma biblioteca desenvolvida para facilitar a interface entre MongoDB e Node.js.
Este livro foi criado para um curso na Udemy, sendo assim, o mesmo deve ser usado em junção com o curso, para maior desempenho. Uma versão presencial também foi lançada, estamos esperando os alunos para começar. Aqui.

SIMON HOLMES; CLIVE HARBER. Getting MEAN WITH MONGO, EXPRESS, ANGULAR, AND NODE. SECOND EDITION. Manning Shelter Island. 2019 by Manning Publications Co. Vai ser chamado de Simon&Cliver (2019).
Dependências
Apesar do curso ser sobre Mongoose, o Mongoose trabalha como suporte para a interação entre o MongoDB e Express (Nodej.s).
IMP. certifique-se de que você tem o MongoDB e Node.js instalados.
Vamos usar o npm
como instalador e gerenciador de pacotes. Uma alternativa seria o yarn
. Com exceção de diferenças iniciais, quando o yarn
foi lançado, ou quando o usamos React, os dois gerenciadores de pacotes parecem o mesmo. Eu, pessoalmente, salve casos pontuais, não vejo a diferença.
Crie um package.json
, antes de instalar o Mongoose, isso vai ajudar depois a gerenciar tudo.
npm init
Agora, instala o Mongoose! 😀😀
npm install mongoose
Seu arquivo package.json
deve ter o seguinte formado, para efeito de clareza:
{
"name": "sandbox-1",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"mongoose": "^5.12.13"
}
}
Primeiro exemplo, simples: salvando os gatos para compartilhar no WhatsApp
Vamos criar uma aplicação que salva gatos🐱🐱🐱, perfeito para compartilhar no WhatsApp!😂😂😂 Gatinhos peludos e com olhos grandes.
Preparação inicial
// getting-started.js
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });
//Seja notificado quando a conexão for feita
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () {
// we're connected!
console.log("connected");//pode-se escrever o que quiser aqui, o importante é escrever algo
});
Nosso primeiro esquema
Vamos fazer nosso primeiro esquema, não me refiro a achar uma forma de ganhar vantagens nos outros 😂😂😂.
MongoDB é um banco de dados não relacional (NoSQL). Pode-se fazer qualquer coisa no sentido de formato, esqueça o Excel e comece a pensar orientado a objetos. Você pode salvar no mesmo espaço um gato com 3 patas e um gato com duas, um gato que tem pedigree, e outro que não tem, um gato que tem dono, e outro que não tem. Por agora, não vou entrar nos méritos dessa nova forma de guardar informação, somente aceite que existem vantagens, e desvantagens.... no mundo da programação se diz "no free lunch".
//nosso esquema para gatos fofinhos
const kittySchema = new mongoose.Schema({
name: String
});
Estamos dizendo para o Mongoose que os gatos fofinhos precisam de um nome.
Agora precisamos dizer para o Mongoose: "salva aí pô!". Em linguagem do Mongoose:
//compilação do nosso esquema
const Kitten = mongoose.model('Kitten', kittySchema);
Isso cria um esquema que pode inclusive ser acessado de outras partes da aplicação, como uma variável global. Legal não?!🙃 Calma aí que o Brasil ainda é nosso, vamos usar isso em combate no futuro!
Finalmente, fechamos o ciclo:
//Nosso primeiro gato
const silence = new Kitten({ name: 'Silence' });
console.log(silence.name); // imprimi: 'Silence'
Isso fecha o ciclo.
Nosso primeiro método
Para mim, como programador Java, com muito orgulho, adorei essa funcionalidade. Basicamente, pode-se criar métodos para manipular cada campo, or "path" usando a linguagem do Mongo.
Caso esteja seguindo por aqui, antes da compilação do esquema, coloque:
// NOTE: methods must be added to the schema before compiling it with mongoose.model()
kittySchema.methods.speak = function () {
const greeting = this.name
? "Meow name is " + this.name
: "I don't have a name";
console.log(greeting);
}
Depois da compilação do esquema, coloque:
const fluffy = new Kitten({ name: 'fluffy' });
fluffy.speak(); // "Meow name is fluffy"
Isso vai imprimir a mensagem "Meow name is fluffy".
Nosso primeiro teste
Para os testes, vamos usar uma biblioteca npm
chamada de Jest.
Testando a saída do esquema
Lembra que imprimimos a saída do esquema? para testarmos se havia realmente salvado o nome do gato no esquema?
Aquilo que fizemos foi um teste, "meia boca"😂😂😂, mas foi. E se criássemos um teste que simplesmente diria "passou" ou "não passou". Isso pode ser interpretado facilmente, além de poder ser automatizado em processos de deploys.
Vamos testar isso em TDD! O que vamos fazer é conhecido como teste de unidade, ou unit test em inglês. Nesse tipo de teste, estamos testando a menor unidade de código possível. O oposto seria teste de integração, ou integration test.
Instalando o Jest
npm install --save-dev jest
Criando nosso arquivo para teste
Geralmente, o arquivo de teste leva o mesmo nome do arquivo que será testado +.test.js
//getting-started.test.js
const Kitten = require("./getting-started");
describe('Testando nosso modelo de gatos fofinhos', () => {
it('Estamos testando se o nome é salvo no esquema', () => {
const name = 'Silence';
const silence = new Kitten({ name: name });
expect(silence.name).toBe(name);
})
})
Isso cria nosso primeiro teste com Jest. Isso faz o mesmo que foi feito com console.log, exceto que:
O teste é automatizado, pode ser facilmente interpretado tanto por outros programadores quanto por sistemas automatizados de deploy;
O teste não interfere com o código, enchendo de console.log, que depois precisamos lembrar de remover;
O teste não ativa nada além do que está sendo testando, como no caso de testar os esquemas do Mongoose que vamos fazer no futuro.
O teste foi um sucesso! Agora tente testar se o Mongoose aceita o seguinte para criar o documento:
new Kitten({ name })
Testando nosso primeiro método
Como estamos começando, esquentando os motores, o teste que vamos fazer é simples, contudo, o Jest tem muito mais, como spy, mock...ver documentação do Jest. Vamos cobrir neste curso somente o relacionado ao Mongoose, que é o foco do curso, e mesmo assim, não pretendo ser exaustivo.
Adicione o seguinte ao seu arquivo de teste:
describe('Testando os métodos associado ao nosso modelo de gatos fofinhos', () => {
it('Testando se o gato fala', () => {
const name = 'Silence';
const silence = new Kitten({ name: name });
expect(silence.speak()).toBe(`Meow name is ${name}`);
})
})
O teste vai falhar! Eu sei que isso incomoda, contudo, faz parte do processo do TDD. Antes de continuar, porque está falhando?? qual a forma mais simples de se resolver isso?
Para passar, somente adicione isso antes de compilar seu esquema Mongoose, no arquivo de definição do esquema:
//app.js
// NOTE: methods must be added to the schema before compiling it with mongoose.model()
kittySchema.methods.speak = function () {
return `Meow name is ${this.name}`
}
Nosso teste passou. Sem querer ser estraga momentos, esse foi fácil!! Conseguimos acertar de primeiras. Em outros cenários, será necessário refazer os códigos mais de uma vez.

Salvando nosso primeiro documento
fluffy.save(function (err, fluffy) {
if (err) return console.error(err);
fluffy.speak();
});
Esse código salva o documento no Mongoose.
Mockando o método save do Mongoose usando mockingoose

//app.test.js
describe('Testando o método save, built-in do Mongoose', () => {
/**test 1: estamos testando se o método greeting ainda funciona depois de ser retornado
*/
it('Estamos testando se o método greeting está funcionando depois de salvar no Mongo', () => {
const name = 'Silence';
const doc = { name: name };
const silence = new Kitten(doc);
mockingoose(Kitten).toReturn(doc, 'save');
silence.save(function (err, fluffy) {
if (err) return console.error(err);
expect(fluffy.greeting()).toBe(`Miau, meu nome é ${name}`);
})
})
})
Nosso próximo teste é sobre o ID devolvido.
//app.test.js
/**teste 2: será se o id devolvido respeita os padrões do MongoDB?*/
it('Estamos testando se o _id bate depois de salvar', () => {
const name = 'Silence';
const doc = { _id: "60cd1ec311ffa407304ec160", name: name };
const silence = new Kitten({ name: name });
mockingoose(Kitten).toReturn(doc, 'save');
silence.save(function (err, fluffy) {
if (err) return console.error(err);
expect(objectid.isValid(fluffy._id)).toBeTruthy();
})
})
Last updated
Was this helpful?