测试Express API需要本地服务器。

3

我读到可以在Express应用程序(nodeJS)中使用超级测试运行mocha测试,因此不需要在不同的终端会话中运行应用程序。无论我尝试什么,它总是以连接错误结束。

为了配置我们的持续集成,很明显集成和单元测试(mocha,supertest,should)应该能够在未运行节点服务器的情况下运行。

编写的测试是为了验证我们应用程序的内部API端点。谁能解释如何在不运行应用程序的Express服务器的情况下运行这些测试,以便它们可以与例如Strider集成?

1个回答

7
您需要将调用app.listen的生产代码拆分出来,并确保在mocha测试运行期间不会执行。我将所有路由和设置代码放在app/index.js中,然后有一个单独的文件app/server.js,其中只有一小部分代码用于启动侦听、连接到数据库等。但大多数应用程序详细信息都是在app/index.js中配置的,因此我可以使用supertest进行测试。
//index.js
var app = require("express")();

app.get("/", function (req, res) {
  res.type("text");
  res.send("Welcome home");
});

module.exports = app;

//server.js
#!/usr/bin/env node
var app = require("./index");
app.listen(3000);

//index.mocha.js
var app = require("./index");
var request = require("supertest")(app);
var expect = require("expectacle");

describe("the home page", function () {
  it("should welome me in plain text", function(done) {
    request.get("/")
      .expect(200)
      .expect("Content-Type", "text/plain; charset=utf-8")
      .end(function (error, result) {
        expect(error).toBeFalsy();
        expect(result.text).toBe("Welcome home");
        done();
      });
  });
});

1
感谢您的反馈。您能分享一下您正在使用的相同的app/server.js文件和app/index.js文件吗? - Peter Van de Put
这个程序是否仍在运行一个 Express 进程并监听 supertest 指定的端口,还是所有东西都在一个进程中运行?(即,如果我在 index.mocha.js 上运行调试器,是否可以步入我的 Express 应用程序代码?) - Greg Wilson
是的,服务器监听一个临时端口(操作系统选择一个可用的高端口)。这是一个节点进程(supertest客户端和express服务器在同一个进程中运行)。是的,您可以调试它并逐步执行代码。 - Peter Lyons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接