MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como testar a unidade de um método que se conecta ao mongo, sem realmente se conectar ao mongo?


Existem algumas respostas SO relacionadas ao código de teste de unidade que usa o MongoDB como um armazenamento de dados:
  • Modificando banco de dados em node.js?
  • Mosque/teste o banco de dados Mongodb Node.js
  • MongoDB incorporado ao executar testes de integração
  • Semelhante:aulas de teste de unidade com funcionalidade on-line

Vou tentar consolidar essas soluções.

Preâmbulo


Em primeiro lugar, você deve deseja que o MongoDB seja executado durante a execução de seus testes. A linguagem de consulta do MongoDB é complexa, portanto, é necessário executar consultas legítimas em uma instância estável do MongoDB para garantir que suas consultas sejam executadas conforme o planejado e que seu aplicativo esteja respondendo adequadamente aos resultados. Com isso em mente, no entanto, você deve nunca execute seus testes em um sistema de produção, mas sim em um sistema periférico para seu ambiente de integração. Isso pode estar na mesma máquina que seu software de CI ou simplesmente relativamente próximo a ele (em termos de processo, não necessariamente de rede ou geograficamente falando).

Esse ENV pode ter pouco espaço ocupado e ser executado completamente na memória (recurso 1) (recurso 2), mas não exigiria necessariamente as mesmas características de desempenho do seu ENV de produção. (Se você quiser testar o desempenho, isso deve ser tratado em um ambiente separado do seu CI.)

Configuração

  • Instalar um mongod serviço especificamente para CI. Se os conjuntos de substituição e/ou fragmentação forem motivo de preocupação (por exemplo, preocupação de gravação, não use $isolated , etc.), é possível imitar um ambiente em cluster executando vários mongod instâncias (1 configuração, dados 2x2 para shard+repl) e um mongos instância na mesma máquina com alguns scripts/ajustes init.d ou algo como docker.
  • Use configurações específicas do ambiente dentro de seu aplicativo (incorporado por meio de arquivos .json ou em algum lugar como /etc, /home/user/.your-app ou similar). Seu aplicativo pode carregá-los com base em uma variável de ambiente de nó como NODE_ENV=int . Dentro dessas configurações, suas strings de conexão db serão diferentes. Se você não usando configurações específicas de env, comece a fazer isso como um meio de abstrair as configurações de tempo de execução do aplicativo (ou seja, "local", "dev", "int", "pre", "prod", etc.). Posso fornecer uma amostra mediante solicitação.
  • Inclua acessórios orientados a testes com seu aplicativo/conjunto de testes. Conforme mencionado em uma das perguntas vinculadas, o driver Node.js do MongoDB suporta algumas bibliotecas auxiliares:mongodb-fixtures e node-database-cleaner . As luminárias fornecem um conjunto de dados consistente e funcional para teste:pense nelas como um bootstrap.

Construções/testes

  1. Limpe o banco de dados associado usando algo como node-database-cleaner .
  2. Preencha seus equipamentos no banco de dados agora vazio com a ajuda de mongodb-fixtures .
  3. Realize sua compilação e teste.
  4. Repita.

Por outro lado...


Se você ainda decidir que não executar o MongoDB é a abordagem correta (e você não seria o único), então abstrair suas chamadas de armazenamento de dados do driver com um ORM é sua melhor aposta (para todo o aplicativo, não apenas para teste). Por exemplo, algo como model afirma ser agnóstico de banco de dados, embora eu nunca o tenha usado. Utilizando essa abordagem, você ainda precisaria de instalações e configurações de ambiente , no entanto, você não precisa instalar o MongoDB. A ressalva aqui é que você está à mercê do ORM que escolher.