gpt4 book ai didi

node.js - 使用 supertest、express 和 mocha 对 api 进行 grunt 测试

转载 作者:搜寻专家 更新时间:2023-10-31 23:35:35 24 4
gpt4 key购买 nike

我有一个通过 express 运行的 https 服务器,我使用 mocha 和 supertest 对其进行了测试。

我的问题是 - 如果我只运行测试 - 没问题。如果我尝试运行带有测试的 gruntfile 然后运行 ​​express - 我看到很多 EADDRINUSE 错误,即使在测试文件中我用 app.close() 执行 after()。这同样适用于测试中的 watch 任务。

这是我的示例测试:

/* jshint node: true*/
/*global describe, it, after*/
(function() {
'use strict';
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var request = require('supertest');
var app = require('../server.js').app;
var expect = require('chai').expect;
var Cookies;

after(function(done) {
app.close();
setTimeout(function(){done();}, 1500);
});

describe('/login', function() {
it('should auth the user', function(done) {
request(app)
.post('/login')
.send({login: "test", password: 'test'})
.expect(302)
.end(function(err, res) {
expect(err).to.be.equal(null);
expect(res.text).to.be.equal("Moved Temporarily. Redirecting to /");
Cookies = res.headers['set-cookie'].pop().split(';')[0];
done();
});

});
});
// testing API for serving session data for angualar factory
describe('/api/session', function() {
it('should return session data in JSON', function(done) {
var req = request(app).get('/api/session');
req.cookies = Cookies;
req.set('Accept','application/json')
.end(function(err, res) {
expect(err).to.be.equal(null);
expect(res.body).to.have.property("_id");
done();
});
});
});

}());

我知道这些测试远非完美。我刚刚开始进行适当的软件测试。

所有那些“已在使用的端口”都是显而易见的,而且没有一个……给出任何问题。所有测试工作正常,服务器工作正常,但标准输出很疯狂。这种行为远非理想,并且可能充满潜在问题和不稳定问题。

我的问题是 - 如何摆脱它?

我的想法是:

  • 创建专用服务器以在不同端口上进行测试。不幸的是,我必须知道如何实现它。

  • 设置一些条件让 superagent 在服务器未运行时运行服务器,或者只是......否则将其传递给 superagent?

  • 使用其他东西然后使用 superagent(例如请求,但我不确定所有 cookie 和 node_tls_reject_unauthorized 是否都有效。

如您所见 - 我在这个话题上苦苦挣扎,问题多于答案,而且没有足够的经验知道该看哪里。

非常感谢任何帮助。

编辑:

我发现,我可以做到:

before(function(done) {
app.listen(3001, function() { done(); });
});

它在另一个端口上开始测试但是......整个 server.js 无论如何都会加载,所以它也会启动。然后,当它与运行服务器一起触发时,有明显的 EADDRINUSE。

最佳答案

当使用 superagent 时,您应该始终将已配置(注册中间件、路由 Controller 等)但未初始化为 HTTP 服务器的 Express 应用程序传递给它。它会为你做到这一点,它会推迟到http.createServer。 , 操作系统选择一个可用的端口。

如果您目前知道 server.js 模块已经提供了一个成熟的 HTTP 服务器的静态实例,那很可能是您问题的根源。在任何一种情况下,尝试从实际的服务器实例中提取应用程序配置/ Bootstrap ,如下所示:

// server.js
var express = require('express');
var middleware = require('./middleware');
var controllers = require('./controllers');

// Configures the Express application instance.
exports.setup = function (app) {
app.use(middleware.foo);
app.get('/bar', controllers.bar);

app.locals.baz = 'quux';
}

// You might shoot yourself in the foot if parts of your application depend
// on a static reference at `server.app`.
exports.app = setup(express());
exports.app.listen(3000);

然后,在您的测试中,您可以按照以下方式做一些事情:

// tests.js
var express = require('express');
var server = require('./server');

describe('Server tests', function () {
// Create a fresh server instance prior to each test
beforeEach(function createNewSever() {
this.app = server.setup(express());
});

describe('Foo', function () {
it('barrs', function () {
request(this.app) // initializes a server instance on port A
// ... supertests
});

it('bazzes', function () {
request(this.app) // initializes a server instance on port B
// ... more supertests
});
});
});

这仅用于说明目的,何时/如何实例化应用程序实例将取决于您的测试上下文。要带走的重要一点是,您应该能够为您的测试用例创建新鲜、干净、独立和隔离的服务器实例。如果您使用并行或随机顺序执行测试的测试运行器,这是绝对必要的。

关于node.js - 使用 supertest、express 和 mocha 对 api 进行 grunt 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25023514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com