- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个通过 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/
我正在使用 supertest 发送获取查询字符串参数,我该怎么做? 我试过 var imsServer = supertest.agent("https://example.com"); imsSe
我正在使用 expressjs 构建 API,我的路线如下所示 module.exports = function(app){ var book = require('../controllers/b
我是测试驱动开发的新手,正在尝试使用 super 测试来自学。我很困惑为什么我不断收到错误“应用程序未定义”?这是我对 request(app) 的调用,我在下面用粗体显示了它。我尝试查找文档,但似乎
初学者使用 Javascript 进行测试。我正在使用摩卡,但路易斯明智地表示,这个问题并不是摩卡特有的。我有一个 Node 应用程序,其中一些页面对匿名用户可见,而有些页面如果您未登录,则不应该看到
我正在尝试用 typescript 编写 API 测试。 我已经像这样安装了以下软件包: npm install -g mocha npm install chai npm install super
我有以下服务器类: import express, { Request, Response } from 'express'; export default class Server { serv
我正在使用 express 开发一个 API 并使用 supertest 对其进行测试.我的 API 端点正在返回 tar.gz 文件。我想测试一下文件是否正确发送并且内容是否正确。我在弄清楚如何检索
我是后端开发的新手,我遇到了一个我不明白的问题。 我设置了名为“health”的 API 的第一个路由,它只返回一条简单消息以了解我的服务器是否已启动。 这条路线看起来像预期的那样工作。 但是, 当我
我懂了 TypeError: Cannot read property 'status' of undefined 当尝试使用 supertest 将文件上传到简单的 Restify 服务器时,并且打
用supertest,我可以测试重定向代码302 var request = require('supertest'); var app = require('../server').app; des
我正在使用 supertest 测试我的 API 端点,而且效果很好,但我不知道如何测试文件下载是否成功。 在我的路由文件中,我将端点定义为: app.get('/api/attachment/:id
当我进行 API 调用时,我想检查返回的 JSON 的结果。我可以看到正文和一些静态数据正在被正确检查,但是在我使用正则表达式的任何地方,事情都被破坏了。这是我的测试示例: describe('get
我无法运行多个 Supertest/Mocha 测试,因为出现错误 Error: Trying to open unclosed connection. - 我发现了这个 post这建议循环并检查连接
我有一个使用 multer 并获取文件数组的 post 端点: router.post('/api/projects/:id/sessions', upload.array('files', 4),
我有一个经过 Mocha 测试的应用程序,并且能够使用我现在拥有的内容成功运行测试,但我在测试文件中显式设置了到 /api/v1 的 GET 路由。这是测试文件... API.js: var requ
我在 supertest、mocha 和 Node 方面遇到了一些问题,解析状态代码为 400。 这是我的 index.js 代码: var express = require('express');
我希望能够获取一些响应属性,并有时使用 SuperTest 将它们放入变量中。我怎样才能做到这一点?除了对响应的断言之外,我没有看到文档执行任何操作。 例如我想做这样的事情: var statusC
下面的数组(query.conditions)以某种方式转换为对象,知道为什么以及如何防止它吗? 请求: supertest(options.url) .g
我有一个看起来像这样的测试: it('should fail to get deleted customer', function(done) { request(app) .
我正在使用 supertest 测试我的 NodeJS 应用程序.我的应用程序正在请求证书,我的用户获得了针对该应用程序的授权证书的 CN。 在测试我的第一条路线时,我收到一个错误,提示我的自签名证书
我是一名优秀的程序员,十分优秀!