我如何在我的node.js应用程序中模拟数据库,在本例mongodb中将其用作博客REST API的后端?
mongodb
当然,我可以将数据库设置为特定的testing数据库,但是我仍然会保存数据,不仅要测试我的代码,还要测试数据库,所以我实际上不是在进行单元测试,而是在进行集成测试。 那该怎么办?创建数据库包装程序作为应用程序和数据库之间的中间层,并在测试时替换DAL?
testing
// 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(); }); }); ));
我认为如果不使用数据库软件进行测试,就无法正确测试与数据库相关的代码。这是因为您要测试的代码不仅是javascript,而且还是数据库查询字符串。即使在您的情况下查询看起来很简单,您也不能永远依赖它。
因此,任何数据库仿真层都必须实现整个数据库(也许减去磁盘存储)。到那时,即使您称其为单元测试,也最终需要使用数据库仿真器进行集成测试。另一个缺点是,与数据库相比,数据库模拟器可能最终会遇到一系列不同的错误,并且您最终可能不得不为数据库模拟器和数据库编写代码(类似于IE,Firefox,Chrome等情况)。 )。
因此,我认为,正确测试代码的唯一方法是将其与真实数据库接口。