Artisan
Artisan

Reputation: 4112

Test multiple http requests to express application using Jasmine

I have installed Jasmine CLI globally using npm install -g jasmine

I'm trying to test multiple http requests at once using test suite below, multiple calls per each requests were sent (seeing output of console.log() but nothing returned so the test was failure, please guide me is this possible to do so ? and how to do this ?

index.js

var app = require('express')();
var request = require('request');

app.get('/', function(req, res) {
    console.log('GET /');
    res.status(200);
    res.send('Hello World');
});

app.listen(3000);

spec/multipleRequestSpec.js

var request = require('request');
var async = require('async');

describe('express application', function() {
    var baseUrl = 'http://localhost:3000';
    var statusCode = [0, 0];
    var b = ['', ''];

    beforeEach(function(done) {
        async.parallel([
            function() {
                request.get(baseUrl, function(err, res, body) {
                    statusCode[0] = res.statusCode;
                    b[0] = body;
                })
            }
            ,
            function() {
                request.post(baseUrl, function(err, res, body) {
                    statusCode[1] = res.statusCode;
                    b[1] = body;
                })
            }
        ], done());
    });

    it('should return 200', function() {
        expect(statusCode[0]).toBe(200);
    });

    it('should return hello world', function() {
        expect(b[0]).toEqual('Hello World');
    });

    it('should return error 404', function() {
        expect(statusCode[1]).toBe(404);
    });
});

Edited

When testing only one request I place done() inside the request() it works just fine, but I quite confuse where to place done() when using async.pararell()

spec/requestSpec.js

var request = require('request');

describe('expresss application', function() {
    var baseUrl = 'http://localhost:3000';
    var statusCode = 0;

    beforeEach(function(done) {
        request.get(baseUrl, function(err, res, body) {
            statusCode = res.statusCode;
            done();
        });

    });

    it('should return 200', function() {
        expect(statusCode).toBe(200);
    });
});

Upvotes: 1

Views: 1214

Answers (1)

Krzysztof Sztompka
Krzysztof Sztompka

Reputation: 7204

In describe block you initiate variable body. And you use it in it blocks. But in request.get and in request.post you have callback function with parameter body which is in use instead of your describe body variable.

Change beforeEach to:

beforeEach(function(done) {
    async.parallel([
        function(callback) {
            request.get(baseUrl, function(err, res, reqBody) {
                statusCode[0] = res.statusCode;
                body[0] = reqBody;
                callback();
            })
        }
        ,
        function(callback) {
            request.post(baseUrl, function(err, res, reqBody) {
                statusCode[1] = res.statusCode;
                body[1] = reqBody;
                callback();
            })
        }
    ], done);
});

I think that you should also check err param in request callbacks. Because there may be errors which fails/pass your tests.

For api endpoints tests it is more easy to use superagent or supertest instead of request.

Upvotes: 1

Related Questions