मोचा एपीआई परीक्षण: 'टाइपर्रर: app.address एक फ़ंक्शन नहीं है' प्राप्त करना


102

मेरा मुद्दा

मैं एक बहुत ही सरल CRUD एपीआई कोडित है और मैं हाल ही में भी कुछ परीक्षण का उपयोग कर कोडिंग शुरू कर दिया है chaiऔर chai-httpलेकिन जब साथ मेरे परीक्षण चलाने मैं समस्या हो रही है $ mocha

जब मैं परीक्षण चलाता हूं तो मुझे शेल पर निम्नलिखित त्रुटि मिलती है:

TypeError: app.address is not a function

मेरा कोड

यहाँ मेरे परीक्षणों में से एक का नमूना है ( /tests/server-test.js ):

var chai = require('chai');
var mongoose = require('mongoose');
var chaiHttp = require('chai-http');
var server = require('../server/app'); // my express app
var should = chai.should();
var testUtils = require('./test-utils');

chai.use(chaiHttp);

describe('API Tests', function() {
  before(function() {
    mongoose.createConnection('mongodb://localhost/bot-test', myOptionsObj);
  });

  beforeEach(function(done) {
    // I do stuff like populating db
  });

  afterEach(function(done) {
    // I do stuff like deleting populated db
  });

  after(function() {
    mongoose.connection.close();
  });

  describe('Boxes', function() {

    it.only('should list ALL boxes on /boxes GET', function(done) {
      chai.request(server)
        .get('/api/boxes')
        .end(function(err, res){
          res.should.have.status(200);
          done();
        });
    });

    // the rest of the tests would continue here...

  });

});

और मेरी expressऐप फाइलें ( /server/app.js ):

var mongoose = require('mongoose');
var express = require('express');
var api = require('./routes/api.js');
var app = express();

mongoose.connect('mongodb://localhost/db-dev', myOptionsObj);

// application configuration
require('./config/express')(app);

// routing set up
app.use('/api', api);

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('App listening at http://%s:%s', host, port);
});

और ( /server/routes/api.js ):

var express = require('express');
var boxController = require('../modules/box/controller');
var thingController = require('../modules/thing/controller');
var router = express.Router();

// API routing
router.get('/boxes', boxController.getAll);
// etc.

module.exports = router;

अतिरिक्त नोट्स

मैंने परीक्षण चलाने से पहले /tests/server-test.js फ़ाइल serverमें चर को लॉग आउट करने की कोशिश की है :

...
var server = require('../server/app'); // my express app
...

console.log('server: ', server);
...

और मैं इसका परिणाम एक खाली वस्तु है server: {}:।

जवाबों:


228

आप अपने ऐप मॉड्यूल में कुछ भी निर्यात नहीं करते हैं। इसे अपने app.js फ़ाइल में जोड़ने का प्रयास करें:

module.exports = server

31
मेरे पास एकमात्र मुद्दा यह है कि परीक्षण को फिट करने के लिए आवेदन कोड को कभी नहीं बदलना चाहिए।
dman

@chovy क्या आपने इसे हल किया? मेरे पास एक विकल्प है जो मेरे लिए काम करता है।
स्काईगार्ड

1
संभावित समस्या सर्वर से निपट रही है जिसमें एक async सेवाएँ शामिल हैं, क्योंकि chai-http उस के तर्क को नहीं जानता है, और यह आपके सर्वर के पूरी तरह से शुरू होने से पहले ही सीधे चलेगा
atom2ueki

1
इस मामले में @ नबस्का शायद पहले से ही app.listen (...) के साथ सेट है
Godfrey

अपने परीक्षणों के लिए, आप जोर से ऐप का उपयोग नहीं करते हैं। सूची () जो एक वास्तविक सर्वर शुरू करता है, http.createServer () के बजाय का उपयोग करें
Whyhankee

42

यह सिर्फ फ़ंक्शन के बजाय http.Serverलौटाए गए ऑब्जेक्ट को निर्यात करना महत्वपूर्ण है , अन्यथा आपको मिलेगा ।app.listen(3000)appTypeError: app.address is not a function

उदाहरण:

index.js

const koa = require('koa');
const app = new koa();
module.exports = app.listen(3000);

index.spec.js

const request = require('supertest');
const app = require('./index.js');

describe('User Registration', () => {
  const agent = request.agent(app);

  it('should ...', () => {

2
आपको अपने उत्तर में शामिल करना चाहिए कि " http.Serverवस्तु निर्यात करना क्यों महत्वपूर्ण है "।
ग्रम्पी क्रैटन

@GrumpyCrouton मैंने वह त्रुटि जोड़ी जो आपको अन्यथा मिलेगी
किम

1
शुक्रिया किम। मैंने आपको एक +1 दिया क्योंकि मुझे लगता है कि इससे आपके उत्तर में सुधार होता है। भविष्य में, आपको स्पष्ट करना चाहिए कि क्यों । कल्पना कीजिए कि कोई व्यक्ति इस प्रश्न को देख रहा है और उसके पास केवल बुनियादी ज्ञान है, अच्छी तरह से सोचा गया और समझाया गया उत्तर उन्हें और भी बहुत कुछ सिखाएगा।
ग्रंपसीट्रॉन

अपने परीक्षणों के लिए, आप जोर से ऐप का उपयोग नहीं करते हैं। सूची () जो एक वास्तविक सर्वर शुरू करता है, http.createServer () का उपयोग करें
Whyhankee

28

यह भी मदद कर सकता है, और एक परीक्षण के लिए आवेदन कोड बदलने के @dman बिंदु को संतुष्ट करता है।

आवश्यकतानुसार लोकलहोस्ट और पोर्ट के लिए अपना अनुरोध करें chai.request('http://localhost:5000')

के बजाय

chai.request(server)

यह उसी त्रुटि संदेश को तय करता है जिसका मैंने Koa JS (v2) और ava js का उपयोग किया था।


3
यह करने के बाद त्रुटि नहीं आ रही है, लेकिन डेटा में शून्य और स्टेटकोड 200 ठीक आ रहा है।
अनीता मेहता

4

ऊपर दिए गए उत्तर सही ढंग से समस्या को संबोधित करते हैं: काम supertestकरना चाहते हैं http.Server। हालांकि, app.listen()सर्वर प्राप्त करने के लिए कॉल करने से एक सुनने वाला सर्वर भी शुरू होगा, यह खराब अभ्यास और अनावश्यक है।

आप इसका उपयोग करके इसे प्राप्त कर सकते हैं http.createServer():

import * as http from 'http';
import * as supertest from 'supertest';
import * as test from 'tape';
import * as Koa from 'koa';

const app = new Koa();

# add some routes here

const apptest = supertest(http.createServer(app.callback()));

test('GET /healthcheck', (t) => {
    apptest.get('/healthcheck')
    .expect(200)
    .expect(res => {
      t.equal(res.text, 'Ok');
    })
    .end(t.end.bind(t));
});

1

जब हम अपने नोड + टाइपस्क्रिप्ट सर्वर रहित परियोजना में ts-नोड का उपयोग करके मोचा चलाते हैं तो हमारे पास एक ही मुद्दा था।

हमारे tsconfig.json में "sourceMap" था: सच। इसलिए उत्पन्न, .js और .js.map फाइलें कुछ मजेदार ट्रांसप्लिंग मुद्दों (इस के समान) का कारण बनती हैं। जब हम ts-node का उपयोग करके मोचा रनर चलाते हैं। इसलिए, मैं स्रोत s झंडा को झूठी और सभी .js और .js.map फ़ाइल में हमारे src डायरेक्टरी में सेट कर दूंगा। फिर मसला दूर हो गया।

यदि आपने अपने src फोल्डर में पहले से ही फाइल जेनरेट की है, तो नीचे दिए गए कमांड वास्तव में मददगार होंगे।

src -name " .js.map" -exec rm {} \; src -name " .js" -exec rm {} \;


0

बस के मामले में, अगर कोई हापिज का उपयोग करता है तब भी समस्या उत्पन्न होती है, क्योंकि यह Express.js का उपयोग नहीं करता है, इस प्रकार पता () फ़ंक्शन मौजूद नहीं है।

TypeError: app.address is not a function
      at serverAddress (node_modules/chai-http/lib/request.js:282:18)

यह काम करने के लिए समाधान

// this makes the server to start up
let server = require('../../server')

// pass this instead of server to avoid error
const API = 'http://localhost:3000'

describe('/GET token ', () => {
    it('JWT token', (done) => {
       chai.request(API)
         .get('/api/token?....')
         .end((err, res) => {
          res.should.have.status(200)
          res.body.should.be.a('object')
          res.body.should.have.property('token')
          done()
      })
    })
  })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.