Node Express Mocha test: TypeError: chai.request is not a function

Viewed 10322

I have a Typscript app and API. I wrote the below test per numerous Google searches and some examples found here on SO and other places. I see no issue in the test code. Googling TypeError: chai.request is not a function, so far is getting me now where. Do you see my error below?

Thank you, thank you, thank you for any help :-)

enter image description here

7 Answers

I solved this by the following approach (Express.js with TypeScript)

import chai from 'chai';
import chaiHttp from 'chai-http';

chai.use(chaiHttp);

Hope it helps.

Remember to install @types/chai and other type definition packages for the block above to work

I can reproduce the problem if I enable the esModuleInterop compiler option. When this option is enabled, import * as chai from 'chai'; only imports the members that the chai module has at the time it is imported. Indeed, I believe it's considered dodgy to add exports to an ES module at runtime. Try import chai from 'chai'; or import chai = require('chai'); instead; either one is working for me.

You are mixing import and require syntax, it's a bad idea!

Use only import syntax :

import * as chai from 'chai';
import * as chai-http from 'chai-http';

chai.use(chai-http);

Edit

Unfortunately, it seems that the es6 module syntax is not supported in chai-http. You can see the issue here

import * as chai from 'chai';
import chaiHttp = require('chai-http');

chai.use(chai-http);

Thank you very much for the replies! Ultimately I had to change where/how chai.request was being imported and rewrite the test a good bit. Based on the code in the test you might think 1 or more of the first 5 lines are not necessary, but they all are. Assuming the rest api is started up on 3000, the following code works and the test passes.

Am I writing this api request test correctly? I'm just now learning Mocha/Chai so it's probably wrong...

import * as chai from 'chai';
import chaiHttp = require('chai-http');
chai.use(chaiHttp);
import { Response } from 'superagent';
import { request, expect } from 'chai';

describe('AppController', () => {
    describe('Route GET /app', () => {
        it('Should GET to /app', async () => {
            const res: Response = await request('http://0.0.0.0:3000').get('/app');
            expect(res).to.have.status(200);
            expect(res).to.be.a('object');
        });
    });

});

I can reproduce the issue on my own machine. This is how I solve it.

import * as chai from 'chai';
import chaiHttp = require('chai-http');

chai.use(chaiHttp);

I also need to install @types/chai-http so the compiler knows.

npm install @types/chai-http --save-dev

Hope it helps

install from github

"devDependencies": {
    "chai-http": "git+https://github.com/chaijs/chai-http.git",
  },

Use :

const chai =require('chai');
const chaiHttp = require('chai-http');
chai.use(chaiHttp);

Then use

describe('Chat', () => {
it('should return all data',async()=>{
            chai.request("https://google.com")
            .get('/')
            .end((err, res) => {
             expect(res).to.have.status(200);
             done();
             });
        })
 })
Related