Estou aprendendo Node.js e estou brincando com o Express . Gosto muito da estrutura; no entanto, estou tendo problemas para descobrir como escrever um teste de unidade / integração para uma rota.
Ser capaz de testar módulos simples é fácil e tenho feito isso com o Mocha ; no entanto, meus testes de unidade com Express falham, pois o objeto de resposta que estou passando não retém os valores.
Função de rota em teste (routes / index.js):
exports.index = function(req, res){
res.render('index', { title: 'Express' })
};
Módulo de Teste de Unidade:
var should = require("should")
, routes = require("../routes");
var request = {};
var response = {
viewName: ""
, data : {}
, render: function(view, viewData) {
viewName = view;
data = viewData;
}
};
describe("Routing", function(){
describe("Default Route", function(){
it("should provide the a title and the index view name", function(){
routes.index(request, response);
response.viewName.should.equal("index");
});
});
});
Quando eu executo isso, ele falha para "Erro: vazamentos globais detectados: viewName, dados".
Onde estou errando para que eu possa fazer isso funcionar?
Existe uma maneira melhor para eu testar a unidade do meu código neste nível?
Atualização 1. Trecho de código corrigido, pois inicialmente esqueci "it ()".
Como outros recomendaram em comentários, parece que a maneira canônica de testar os controladores Express é por meio do superteste .
Um exemplo de teste pode ser assim:
Positivo: você pode testar toda a sua pilha de uma vez.
Desvantagem: parece e age um pouco como um teste de integração.
fonte
integration
, e talvez as rotas de teste devam ser deixadas para os testes de integração. Quer dizer, a funcionalidade das rotas correspondentes aos retornos de chamada definidos já foi testada pelo express.js; qualquer lógica interna para obter o resultado final de uma rota, idealmente, deve ser modularizada fora dela e esses módulos devem ser testados na unidade. Sua interação, ou seja, a rota, deve ser testada para integração. Você concordaria?Cheguei à conclusão de que a única maneira de realmente testar a unidade de aplicativos expressos é manter uma grande separação entre os manipuladores de solicitação e sua lógica central.
Portanto, a lógica de seu aplicativo deve estar em módulos separados que podem ser
require
testados em unidades e ter uma dependência mínima das classes Express Request e Response como tal.Em seguida, nos manipuladores de solicitação, você precisa chamar os métodos apropriados de suas classes lógicas centrais.
Vou colocar um exemplo assim que terminar de reestruturar meu aplicativo atual!
Eu acho que algo assim ? (Sinta-se à vontade para desvendar a essência ou comentar, ainda estou explorando isso).
Editar
Aqui está um pequeno exemplo, embutido. Veja a essência para um exemplo mais detalhado.
fonte
A maneira mais fácil de testar HTTP com express é roubar o assistente de http do TJ
Eu pessoalmente uso o ajudante dele
Se você quiser testar especificamente seu objeto de rotas, passe simulações corretas
fonte
se o teste de unidade com express 4 observe este exemplo de gjohnson :
fonte
Eu também estava me perguntando isso, mas especificamente para testes de unidade e não testes de integração. Isso é o que estou fazendo agora,
Onde o routerObj fica justo
{router: expressRouter, path: '/api'}
. Em seguida, carrego os sub-roteadores comvar loginRouterInfo = require('./login')(express.Router({mergeParams: true}));
e o aplicativo expresso chama uma função init tomando o roteador expresso como parâmetro. O initRouter então chamarouter.use(loginRouterInfo.path, loginRouterInfo.router);
para montar o subrouter.O sub-roteador pode ser testado com:
fonte
Para realizar o teste de unidade em vez do teste de integração, eu simulei o objeto de resposta do manipulador de solicitação.
Então, para realizar o teste de integração, você pode simular seu endpointHandler e chamar o endpoint com supertest .
fonte
No meu caso, só queria testar se o manipulador direito foi chamado. Eu queria usar o supertest para lavar a simplicidade de fazer as solicitações ao middleware de roteamento. Estou usando o Typescript a e esta é a solução que funcionou para mim
As rotas
Os testes
Tive alguns problemas para fazer a zombaria funcionar. mas usar jest.doMock e a ordem específica que você vê no exemplo faz com que funcione.
fonte