47

私はNode.jsfelixgeのnode-mysqlクライアントで使用しています。ORMを使用していません。

私はVowsでテストしており、おそらくSinonを使用して、データベースをモックできるようにしたいと考えています。私は(を除いて)DAL自体を実際に持っていないので、これをどうやって行うのnode-mysqlかよくわかりません。私のモデルはほとんどが単純なCRUDで、多くのゲッターがあります。

これを達成する方法について何かアイデアはありますか?

4

6 に答える 6

40

sinon を使用すると、モジュール全体にモックまたはスタブを配置できます。たとえば、mysqlモジュールに関数があるとしますquery:

var mock;

mock = sinon.mock(require('mysql'))
mock.expects('query').with(queryString, queryParams).yields(null, rows);

queryStringqueryParams期待する入力です。rows期待する出力です。

テスト中のクラスが mysql を要求し、queryメソッドを呼び出すと、sinon によってインターセプトされ、検証されます。

テストの期待セクションには、次のものが必要です。

mock.verify()

ティアダウンでは、mysql を通常の機能に戻す必要があります。

mock.restore()
于 2012-04-12T13:19:07.837 に答える
12

データベースを mysql を使用する独自のクラスに抽象化することをお勧めします。次に、require() を使用してロードする代わりに、そのクラスのインスタンスをモデルのコンストラクターに渡すことができます。

この設定により、モック db インスタンスを単体テスト ファイル内のモデルに渡すことができます。

以下に小さな例を示します。

// db.js
var Db = function() {
   this.driver = require('mysql');
};
Db.prototype.query = function(sql, callback) {
   this.driver... callback (err, results);
}
module.exports = Db;

// someModel.js
var SomeModel = function (params) {
   this.db = params.db
}
SomeModel.prototype.getSomeTable (params) {
   var sql = ....
   this.db.query (sql, function ( err, res ) {...}
}
module.exports = SomeModel;

// in app.js
var db = new (require('./db.js'))();
var someModel = new SomeModel ({db:db});
var otherModel = new OtherModel ({db:db})

// in app.test.js
var db = {
   query: function (sql, callback) { ... callback ({...}) }
}
var someModel = new SomeModel ({db:db});
于 2012-03-15T15:14:00.527 に答える
5

私は node.js に完全に精通しているわけではありませんが、従来のプログラミングの意味では、そのようなテストを実現するには、データ アクセス メソッドから抽象化する必要があります。次のような DAL クラスを作成できませんでした:

var DataContainer = function () {
}

DataContainer.prototype.getAllBooks = function() {
    // call mysql api select methods and return results...
}

テストのコンテキストで、初期化中に次のように getAllBooks クラスにパッチを適用します。

DataContainer.prototype.getAllBooks = function() {
    // Here is where you'd return your mock data in whatever format is expected.
    return [];
}

テスト コードが呼び出されると、getAllBooks は、実際に mysql を呼び出すのではなく、モック データを返すバージョンに置き換えられます。繰り返しますが、私は node.js に完全に精通しているわけではないので、これは大まかな概要です。

于 2012-01-07T14:59:22.477 に答える
3

horaaを使用して外部依存関係をモックアウトできます

また、felixge のノード sandboxed -moduleも同様のことができると思います。

したがって、kgilpin の同じコンテキストを使用すると、horaa では次のようになります。

var mock = horaa('mysql');
mock.hijack('query', function(queryString, queryParam) {
    // do your fake db query (e.g., return fake expected data)
});

//SUT calls and asserts

mock.restore('query');
于 2012-06-05T21:46:33.067 に答える