【问题标题】:Test multiple http requests to express application using Jasmine使用 Jasmine 测试多个 http 请求以表达应用程序
【发布时间】:2015-11-09 16:42:19
【问题描述】:

我已经使用 npm install -g jasmine 全局安装了 Jasmine CLI

我正在尝试使用下面的测试套件一次测试多个 http 请求,每个请求都发送了多个调用(看到 console.log() 的输出,但没有返回任何内容,因此测试失败,请指导我是否可以这样做所以呢?怎么做呢?

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);
    });
});

已编辑

当只测试一个请求时,我将done() 放在request() 中,它工作得很好,但是当使用async.pararell() 时,我很困惑在哪里放置done()

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);
    });
});

【问题讨论】:

    标签: express jasmine


    【解决方案1】:

    describe 块中,您启动变量body。你在it 块中使用它。但是在 request.get 和 request.post 中,您有带有参数 body 的回调函数,它正在使用而不是您的 describe body 变量。

    beforeEach 更改为:

    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);
    });
    

    我认为您还应该在请求回调中检查err 参数。因为可能存在导致测试失败/通过的错误。

    对于 api 端点测试,使用 superagentsupertest 而不是 request 更容易。

    【讨论】:

    • 感谢@Krzysztof 我试过了,但还是不行,我认为问题在于在哪里放置done()回调
    • 我已经编辑了我的答案,请再检查一遍(我之前写的也是正确的,但现在我又解决了一个问题)
    • 您的回答实际上解决了我的问题,谢谢,但我怀疑为什么如果我有多个 it() 块,请求将按 it() 块的数量发送
    猜你喜欢
    • 2016-06-03
    • 2020-03-06
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多