私はNode.js
felixgeのnode-mysql
クライアントで使用しています。ORMを使用していません。
私はVowsでテストしており、おそらくSinonを使用して、データベースをモックできるようにしたいと考えています。私は(を除いて)DAL自体を実際に持っていないので、これをどうやって行うのnode-mysql
かよくわかりません。私のモデルはほとんどが単純なCRUDで、多くのゲッターがあります。
これを達成する方法について何かアイデアはありますか?
sinon を使用すると、モジュール全体にモックまたはスタブを配置できます。たとえば、mysql
モジュールに関数があるとしますquery
:
var mock;
mock = sinon.mock(require('mysql'))
mock.expects('query').with(queryString, queryParams).yields(null, rows);
queryString
、queryParams
期待する入力です。rows
期待する出力です。
テスト中のクラスが mysql を要求し、query
メソッドを呼び出すと、sinon によってインターセプトされ、検証されます。
テストの期待セクションには、次のものが必要です。
mock.verify()
ティアダウンでは、mysql を通常の機能に戻す必要があります。
mock.restore()
データベースを 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});
私は 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 に完全に精通しているわけではないので、これは大まかな概要です。
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');