1. ホーム
  2. node.js

[解決済み] node.jsでデータベースをモックする?

2023-06-08 14:34:10

質問

私の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();
    });

  });
));

どのように解決するのですか?

データベース関連のコードは、データベースソフトウェアでテストしないと、正しくテストできないと思います。なぜなら、テストするコードは javascript だけでなく、データベースのクエリ文字列も含まれるからです。あなたのケースでは、クエリが単純に見えても、それがずっとそのままであるとは限りません。

そのため、データベースエミュレーション層は、必然的にデータベース全体(ディスクストレージは除く)を実装することになります。そうなると、ユニットテストと称していても、結局はデータベースエミュレータで統合テストを行うことになります。もう 1 つの欠点は、データベース エミュレーターがデータベースと比較して異なるバグのセットを持つことになり、データベース エミュレーターとデータベースの両方についてコーディングしなければならなくなることです (IE 対 Firefox 対 Chrome などの状況のようなもの)。

したがって、私の意見では、コードを正しくテストする唯一の方法は、実際のデータベースとインターフェイスすることです。