如何对使用 Express + Mongoose 构建的 NodeJs REST API 服务器进行单元测试?

Posted

技术标签:

【中文标题】如何对使用 Express + Mongoose 构建的 NodeJs REST API 服务器进行单元测试?【英文标题】:How to unit test a NodeJs REST API server built using Express + Mongoose? 【发布时间】:2012-08-28 01:24:50 【问题描述】:

我有一个使用 Express、Mongoose 和 config 的 REST API 服务器。我想对我的 API 进行单元测试。基本上,在端口 x 上启动一个临时 Web 服务器,在端口 y 上启动一个空的 mongo-database,执行一些 API 调用(获取和放置)并验证我返回的内容,然后在我的测试完成后关闭临时服务器并删除测试数据库.做这个的最好方式是什么?我一直在查看mocha/rewire,但不确定如何设置临时服务器和数据库,也不确定最佳实践是什么。

【问题讨论】:

【参考方案1】:

我使用Jenkins(持续集成服务器)和Mocha 来测试我的应用程序,我发现自己遇到了和你一样的问题。我配置了 Jenkins,所以它会执行这个 shell 命令:

npm install
NODE_ENV=testing node app.js &
npm mocha
pkill node

这会运行服务器以执行测试,然后将其终止。这也设置了 NODE_ENV 环境变量,因此我可以在测试时在不同的端口上运行服务器,因为 Jenkins 已经使用端口 8080。

代码如下:

app.js:

...
var port = 8080
if(process.env.NODE_ENV === "testing")
    port = 3000;
...

test.js:

var request = require('request'),
    assert = require('assert');

    describe('Blabla', function() 
      describe('GET /', function() 
        it("should respond with status 200", function(done) 
          request('http://127.0.0.1:3000/', function(err,resp,body) 
            assert.equal(resp.statusCode, 200);
            done(); 
          ); 
        ); 
      );
    );

【讨论】:

【参考方案2】:

我找到了我正在寻找的东西:testrest。我不喜欢它基于 .txt 文件的语法 - 我适应了使用 .json 文件代替我的规范。

【讨论】:

看起来很有趣,但文档似乎不存在...您是否找到任何有用的示例来启动和运行?【参考方案3】:

我建议尝试Buster.JS。您可以进行异步测试、模拟/存根,并启动服务器。

【讨论】:

【参考方案4】:

它也是在vows 之上构建的api-easy,第一个似乎很容易使用,但第二个非常灵活和强大

【讨论】:

不确定如何使用 api-easy 和/或 vows 的备用配置设置来管理启动临时节点服务器。 您是如何尝试配置测试的?【参考方案5】:

没有正确的方法,但我确实为我的个人目录结构创建了一个种子应用程序,并包含@norman784 建议的誓言测试。

你可以克隆它:git clone https://github.com/hboylan/express-mongoose-api-seed.git

或者使用 npm:npm install express-mongoose-api-seed

【讨论】:

以上是关于如何对使用 Express + Mongoose 构建的 NodeJs REST API 服务器进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoldb、mongoose、jade 和 express 通过按钮单击删除条目

不能使用 Node js(express) 和 MongoDB(mongoose) 对用户配置文件进行审核

如何填充递归模式引用 Mongodb、Mongoose、Express?

如何使用 Mongoose、Express、Angular 4 和 NodeJS 上传/保存和显示图片

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型