一尘不染

在node.js中模拟数据库?

node.js

我如何在我的node.js应用程序中模拟数据库,在本例mongodb中将其用作博客REST API的后端?

当然,我可以将数据库设置为特定的testing数据库,但是我仍然会保存数据,不仅要测试我的代码,还要测试数据库,所以我实际上不是在进行单元测试,而是在进行集成测试。
那该怎么办?创建数据库包装程序作为应用程序和数据库之间的中间层,并在测试时替换DAL?

// app.js  
var express = require('express');
    app = express(),
    mongo = require('mongoskin'),
    db = mongo.db('localhost:27017/test?auto_reconnect');

app.get('/posts/:slug', function(req, res){
    db.collection('posts').findOne({slug: req.params.slug}, function (err, post) {
        res.send(JSON.stringify(post), 200);
    });
});

app.listen(3000);

// test.js
r = require('requestah')(3000);
describe("Does some testing", function() {

  it("Fetches a blogpost by slug", function(done) {
    r.get("/posts/aslug", function(res) {
      expect(res.statusCode).to.equal(200);
      expect(JSON.parse(res.body)["title"]).to.not.equal(null);
      return done();
    });

  });
));

阅读 327

收藏
2020-07-07

共1个答案

一尘不染

我认为如果不使用数据库软件进行测试,就无法正确测试与数据库相关的代码。这是因为您要测试的代码不仅是javascript,而且还是数据库查询字符串。即使在您的情况下查询看起来很简单,您也不能永远依赖它。

因此,任何数据库仿真层都必须实现整个数据库(也许减去磁盘存储)。到那时,即使您称其为单元测试,也最终需要使用数据库仿真器进行集成测试。另一个缺点是,与数据库相比,数据库模拟器可能最终会遇到一系列不同的错误,并且您最终可能不得不为数据库模拟器和数据库编写代码(类似于IE,Firefox,Chrome等情况)。
)。

因此,我认为,正确测试代码的唯一方法是将其与真实数据库接口。

2020-07-07