首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在node.js中模拟数据库?

在node.js中模拟数据库?
EN

Stack Overflow用户
提问于 2012-09-21 15:38:24
回答 6查看 64.6K关注 0票数 83

如何模拟node.js应用程序中的数据库,在本例中,该应用程序使用mongodb作为blog REST API的后端?

当然,我可以将数据库设置为特定的testing -database,但我仍然会保存数据,不仅测试我的代码,还测试数据库,所以我实际上不是在做单元测试,而是在做集成测试。

那么我们应该做些什么呢?创建数据库包装器作为应用程序和数据库之间的中间层,并在测试时替换DAL?

代码语言:javascript
复制
// 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);

代码语言:javascript
复制
// 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();
    });

  });
));
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-21 16:17:44

如果不使用数据库软件进行测试,我不认为与数据库相关的代码可以被正确地测试。这是因为您正在测试的代码不仅是javascript,还包括数据库查询字符串。即使在您的例子中,查询看起来很简单,但您不能指望它永远是这样的。

因此,任何数据库模拟层都必须实现整个数据库(可能没有磁盘存储)。到那时,您最终将使用数据库仿真器进行集成测试,即使您将其称为单元测试。另一个缺点是,与数据库相比,数据库仿真器最终可能会有一组不同的bug,而您可能最终不得不同时为数据库仿真器和数据库编写代码(有点像IE、Firefox和Chrome等的情况)。

因此,在我看来,正确测试代码的唯一方法是将其与实际数据库连接。

票数 136
EN

Stack Overflow用户

发布于 2012-09-25 17:39:56

当涉及到模仿时,有一个通用的经验法则,即

不要嘲笑任何你不拥有的东西。

如果您想模拟数据库,请将其隐藏在抽象的服务层之后,并模拟该层。然后,确保集成测试实际的服务层。

就我个人而言,我已经不再使用mock进行测试,而是使用它们进行自上而下的设计,帮助我从上到下推动开发,逐步模拟服务层,然后最终实现这些层并编写集成测试。作为一种测试工具,它们往往会使您的测试非常脆弱,在最坏的情况下,会导致实际行为和模拟行为之间的差异。

票数 45
EN

Stack Overflow用户

发布于 2015-05-27 07:57:00

到目前为止,我不同意所选的答案或其他回复。

如果您能在QA之前捕获由对DB模式和代码所做的混乱且多次混乱的更改而产生的错误,那不是很棒吗?我敢打赌,大多数人会大喊“是的!”

您当然可以而且应该隔离和测试您的DB模式。而且,您不会基于仿真器、重映像或重新创建数据库和机器来执行此操作。这就是像SQLite这样的东西只是作为一个例子。您可以基于内存中运行的轻量级实例来模拟它,并且使用不会在内存实例中更改的静态数据,这意味着您是真正在隔离中测试DB,您也可以信任您的测试。显然,它的速度很快,因为它在内存中,是一个骨架,在测试运行结束时被丢弃。

所以,是的,你应该而且你应该测试这个模式,这个模式被导出到你正在使用的任何数据库引擎/运行时的一个非常轻量级的内存实例中,并且随着添加非常少量的静态数据成为你的隔离的模拟数据库。

在每次推送到QA之前,您定期(以自动方式)从您的真实数据库导出您的真实模式,并将这些模式导入/更新到您的light DB实例中,您将立即知道数据库管理员或最近更改了模式的其他开发人员所做的任何最新DB更改是否破坏了任何测试。

虽然我赞赏你尽最大努力回答的努力,但如果我可以的话,我会否决目前的回答,但我是新人,还没有建立起足够的声誉来使我能够做到这一点。

至于回答“不要嘲笑任何你不拥有的东西”的人。我想他的意思是“不要测试任何你不拥有的东西”。但你却在模仿你不拥有的东西!因为这些都不是测试中需要隔离的东西!

我计划与你分享如何,并将在未来的时间点更新这篇文章与真实的例子JS代码!

这是许多测试驱动团队一直在做的事情。你只需要知道怎么做就行了。

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12526160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档