22

私はノードに比較的慣れておらず、knex と本棚を使用するプロジェクトに取り組んでいます。コードの単体テストで少し問題があり、何が間違っているのかわかりません。

基本的に、次のようなモデル (VorcuProduct と呼ばれる) があります。

var VorcuProduct = bs.Model.extend({
    tableName: 'vorcu_products'
});

module.exports.VorcuProduct = VorcuProduct

また、VorcuProductがDB上に存在しない場合に保存する機能。とてもシンプルです。これを行う関数は次のようになります。

function subscribeToUpdates(productInformation, callback) {
  model.VorcuProduct
    .where({product_id: productInformation.product_id, store_id: productInformation.store_id})
    .fetch()
    .then(function(existing_model) {
        if (existing_model == undefined) {
            new model.VorcuProduct(productInformation)
                .save()
                .then(function(new_model) { callback(null, new_model)})
                .catch(callback);
        } else {
            callback(null, existing_model)
        }
    })
}

DBにアクセスせずにこれをテストする正しい方法はどれですか? fetchモデルまたは未定義 (テストに応じて) を返すようにモックしてから、で同じことを行う必要がありsaveますか? これには再配線を使用する必要がありますか?

ご覧のとおり、私は少し迷っているので、助けていただければ幸いです。

ありがとう!

4

2 に答える 2

22

私は自動テストにインメモリ Sqlite3 データベースを使用しており、大きな成功を収めています。私のテストは、MySQL に対して実行するのに 10 分から 15 分かかりますが、インメモリ sqlite3 データベースではわずか 30 秒程度です。:memory:この手法を利用するには、接続文字列に使用します。

単体テストに関する注意- データベースに対してクエリを実行しているため、これは真の単体テストではありません。これは技術的には統合テストですが、妥当な期間内に実行されます。(私のような) クエリの多いアプリケーションを使用している場合、この手法は単体テストよりもバグの検出に効果的であることが証明されます。

Gotchas - Knex/Bookshelf は、アプリケーションの開始時に接続を初期化します。これは、テスト間のコンテキストを維持することを意味します。テストごとにテーブルを作成および破棄できるように、スキーマの作成/破棄スクリプトを作成することをお勧めします。また、Sqlite3 は MySQL や PostgreSQL よりも外部キー制約の影響を受けにくいため、制約が適切に機能することを確認するために、ときどきこれらのいずれかに対してアプリを実行してください。

于 2015-09-23T21:14:14.480 に答える