14

バックエンド データベースへの接続にKnexを使用しています。しかし、コードを単体テストできるようにしたいと考えています。データベース接続をモックする方法はありますか?

proxyquireを使用してみましたが、動作しないようです。

問題は、Knex の初期化方法にあるようです。

var knex = require('knex')({
  client: 'mysql',
  connection: {}
});

単体テストでモックされるようにknexをセットアップしました。

myService = proxyquire('../app/myService', {
        'knex': knexProxy
});

私のサービスにはknexが含まれています。

var knex = require('knex').knex,

サービスがクエリを実行すると失敗します。

var sql = knex("table_name");
sql.insert(rowToInsert, "auto_increment_id");
sql.then(function (insertId) {
    resolve();
}, function (err) {
    reject(err);
});

何らかの理由で、接続を試みる前にリクエストをキャプチャできないようです。

また、カスタム Knex Clientを作成しようとしましたが、まだ機能していません。

4

6 に答える 6

1

私は自動テストにインメモリ Sqlite3 データベースを使用しており、大きな成功を収めています。これは真の単体テストではありませんが、MySQL や PostgreSQL よりもはるかに高速に実行されます。このソリューションの詳細については、別の質問に投稿しました。

于 2015-09-23T21:19:03.713 に答える
1

私はjestを使用していますが、次のようなことができます:

   jest.mock('knex', () => {
        const fn = () => {
            return {
                select: jest.fn().mockReturnThis(),
                from: jest.fn().mockReturnThis(),
                where: jest.fn().mockReturnThis(),
                first: jest.fn().mockReturnThis(),
                insert: jest.fn().mockReturnThis(),
                raw: jest.fn().mockReturnThis(),
                then: jest.fn(function (done) {
                  done(null)
                })
                
            }
        }
        return fn
    })
于 2020-08-25T09:59:03.210 に答える