Ошибка типа: app.address не является функцией, использующей chai-http

#javascript #testing #chai #fastify #chai-http

#javascript #тестирование #chai #быстрая настройка #chai-http

Вопрос:

Я пытаюсь создать микро-api с помощью Fastify, и теперь я тестирую приложение, но получаю эту ошибку:

 Testing /allstyles
         Should return all style names:
     TypeError: app.address is not a function
      at serverAddress (node_modules/chai-http/lib/request.js:282:18)
      at new Test (node_modules/chai-http/lib/request.js:271:53)
      at Object.obj.<computed> [as get] (node_modules/chai-http/lib/request.js:239:14)
      at Context.<anonymous> (test/routes-chai.js:12:8)
      at processImmediate (internal/timers.js:461:21)
 

Мой файл приложения — это этот:

 const fastify = require('fastify');
var app = fastify({
  logger:{level:'error',prettyPrint:true}
});

app.get('/',(req,res)=>{
  console.log('Hello world');
  res.code(200);
});
module.exports = app;
 

и мой тестовый файл:

 var expect = require('chai').expect;
var app = require('../app/main.js');
var chaiHttp = require('chai-http');
var chai = require('chai');

chai.use(chaiHttp);

describe('Testing routes',()=>{
  describe('Testing /allstyles',()=>{
    it('Should return all style names',(done)=>{
      chai.request(app)
      .get('/')
      .end((err,res)=>{
        expect(res).to.have.status(200);
        done();
      });
    });
  });
});

 

Я пробовал с:

 module.exports = app.listen(3000);
 

и

 module.exports = {app}
 

но он всегда возвращает мне какую-то ошибку, подобную этой или другой, которая гласит:

 TypeError: Cannot read property 'address' of undefined
 

Кто-нибудь знает, что я делаю не так?

Комментарии:

1. Chai.request какой параметр требуется в качестве входных данных? Приложение fastify?

2. Привет, да, chai.request требуется приложение fastify в качестве входных данных

Ответ №1:

chai.request(app) не принимает экземпляр fastify в качестве входных данных, как задокументировано:

Вы можете использовать функцию (например, приложение express или connect) или node.js http (s) сервер как основа для вашего запроса

Вы должны запустить сервер fastify и передать его chai:

 var expect = require('chai').expect;
var app = require('./index.js');
var chaiHttp = require('chai-http');
var chai = require('chai');

chai.use(chaiHttp);

app.listen(8080)
  .then(server => {
    chai.request(server)
      .get('/')
      .end((err, res) => {
        expect(res).to.have.status(200);
        app.close()
      });
  })
 

Это будет работать так, как ожидалось.

ПРИМЕЧАНИЕ: ваш HTTP-обработчик не вызывается reply.send , поэтому запрос истекает, вам тоже нужно это исправить:

 app.get('/', (req, res) => {
  console.log('Hello world');
  res.code(200);
  res.send('done')
});
 

В качестве примечания я бы предложил попробовать fastify.inject функцию, которая
позволит избежать запуска прослушивания сервера, и это значительно ускорит ваш тест, и у вас не будет проблем с уже используемым портом.

Комментарии:

1. Спасибо! Я бы попробовал fastify.inject!

2. Не могли бы вы принять ответ, если он решит вашу проблему? Спасибо

Ответ №2:

 // you must declare the app variable this way
var expect = require('chai').expect;
var app = require('../app/main.js').app;
var chaiHttp = require('chai-http');
var chai = require('chai');

chai.use(chaiHttp);

describe('Testing routes',()=>{
  describe('Testing /allstyles',()=>{
    it('Should return all style names',(done)=>{
      chai.request(app)
      .get('/')
      .end((err,res)=>{
        expect(res).to.have.status(200);
        done();
      });
    });
  });
});
 

Комментарии:

1. Привет. Попробуйте добавить больше деталей. Почему это решает проблему OP? Это поможет людям лучше понять это.