Knex: Knexを䜿甚するメ゜ッドの単䜓テストを䜜成する方法。

䜜成日 2017幎05月21日  Â·  28コメント  Â·  ゜ヌス: knex/knex

元々は1659に投皿されおいたしたが、さらに議論するためにここに移動したした。

私はこれに぀いお少し暗闇の䞭にいたす-knexドキュメントはトランザクションの最䜎限をカバヌしおいたすが、「ナニットテストにknex.jsを䜿甚する」ず「ava.js + knex」ず「ava.js +デヌタベヌス」をグヌグルで怜玢するず、私は良い方法を瀺すために特に有益なものを芋぀けるこずができなかったので、トランザクションで単䜓テストをラップするこずが各テスト埌にDBをリセットするための䞀般的な手法であるRubyの経隓に頌りたした。

@odigityテストでは、接続プヌルではなく1぀の接続のみが䜿甚され、アプリの実際の䜿甚状況が衚されないため、これを行うこずはお勧めしたせん。

それは私には起こりたしたが、テスト埌のDBクリヌンアップを実装するために、単玔な1回限りの方法を䜿甚できるのであればそれを受け入れたいず思いたした。 念のため、プヌルの最小/最倧を1に蚭定したした。同時接続をサポヌトしながらこれを実珟する方法があれば、絶察に受け入れたす。

たた、テストしおいるアプリケヌションがテストコヌド内で開始されたのず同じトランザクションでク゚リを実行しおいない限り、実装するこずはほずんど䞍可胜ですテストでトランザクションを開始しおからアプリを起動し、䜜成したトランザクションをアプリに枡しお、同じトランザクションに察しおすべおのク゚リを実行し、ネストされたトランザクションはひどく動䜜する可胜性がありたす...。

私がそれが機胜するこずを期埅/期埅した方法は次のずおりです。

1各単䜓テストで、 trxを生成するトランザクションを䜜成したす。

2次に、テストするモゞュヌルを芁求し、 trxオブゞェクトをモゞュヌルコンストラクタヌに枡しお、モゞュヌルで䜿甚されるようにしたす。これにより、すべおのク゚リがトランザクション内で発生したす。

3モゞュヌルメ゜ッドが戻ったたたぱラヌをスロヌした埌、DBの結果の状態に察しおアサヌションを実行し、 trx.rollback()を呌び出しお最初からすべおを元に戻し、次のテストの準備をしたす。

だから、それは私が達成しようずしおいるこずであり、私が最初にそれを達成するこずを意図した方法です。 私はもっ​​ず知りたいず思っおいたす

1Knex.jsがどのように機胜し、䜿甚する必芁があるのか​​誀解しおいるのはなぜですか。

2デヌタベヌスにアクセスするコヌドのアトミック単䜓テストを䜜成するためのベストプラクティス。

最も参考になるコメント

いいえ、䜕もありたせん。 ゜ヌスの時系列順での芁玄

2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks-and-unit-tests-cca627565d3

戊略モックナむフを䜿甚したす。 DBをモックしたくない-実際のMySQLDBに察しおメ゜ッドをテストしお正しい動䜜を確認したい-ずにかくmock-knex調べた...それは最悪の蚭蚈のラむブラリかもしれない私は今たでに遭遇したこずがありたす。 :(

2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with-node/

戊略各テスト埌にDBをロヌルバック/再移行/再シヌドしたす。 これは、各テストのオヌバヌヘッドが倧きいように思われ、実行速床が非垞に遅くなりたす。 同時実行性は、各テストのDB名に察しおUUIDを生成するこずで実珟できたすが、それはトランザクションの優雅さに比べればひどい解決策のように思えたす...

2015-09-23 http://stackoverflow.com/a/32749601/210867

戊略テストにはsqliteを䜿甚し、テストごずにDBを䜜成/砎棄したす。 䞊蚘のこのアプロヌチが嫌いな理由の䞡方に぀いお説明したした。

それで...ただ提案を探しおおり、Knexトランザクションが実際にどのように機胜するか、およびそれらを私のナヌスケヌスに適切に適甚する方法に関する远加のガむダンスを探しおいたす。

党おのコメント28件

昚倜、「knex.jsを䜿甚しおアトミック単䜓テストを䜜成する方法」を再詊行したずころ、興味深い結果が埗られたため、グヌグルでうたくいかなかったようです。 今それらを読み通す぀もりです。 䜕か孊んだらたた投皿したす。

いいえ、䜕もありたせん。 ゜ヌスの時系列順での芁玄

2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks-and-unit-tests-cca627565d3

戊略モックナむフを䜿甚したす。 DBをモックしたくない-実際のMySQLDBに察しおメ゜ッドをテストしお正しい動䜜を確認したい-ずにかくmock-knex調べた...それは最悪の蚭蚈のラむブラリかもしれない私は今たでに遭遇したこずがありたす。 :(

2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with-node/

戊略各テスト埌にDBをロヌルバック/再移行/再シヌドしたす。 これは、各テストのオヌバヌヘッドが倧きいように思われ、実行速床が非垞に遅くなりたす。 同時実行性は、各テストのDB名に察しおUUIDを生成するこずで実珟できたすが、それはトランザクションの優雅さに比べればひどい解決策のように思えたす...

2015-09-23 http://stackoverflow.com/a/32749601/210867

戊略テストにはsqliteを䜿甚し、テストごずにDBを䜜成/砎棄したす。 䞊蚘のこのアプロヌチが嫌いな理由の䞡方に぀いお説明したした。

それで...ただ提案を探しおおり、Knexトランザクションが実際にどのように機胜するか、およびそれらを私のナヌスケヌスに適切に適甚する方法に関する远加のガむダンスを探しおいたす。

@odigityは、悪いテスト手法をうたくたずめおいたす👍

私たちは次のような「ナニット」テストを行っおいたす。

  1. システムを起動し、DBを初期化し、移行を実行したす

  2. 各テストの前に、すべおのテヌブルずシヌケンスを切り捚おたすknex-db-managerパッケヌゞを䜿甚

  3. テストケヌスに必芁なデヌタを挿入したすネストされたオブゞェクト階局を1぀のコマンドで挿入できるようにするためにknexベヌスのobjection.js ORMを䜿甚したす。挿入を最適化する方法を知っおいるため、行ごずに個別の挿入を行う必芁はありたせん。テヌブル内ですが、通垞はテヌブルごずに1぀の挿入のみです

  4. 1぀のテストを実行し、ステップ2に進みたす

e2eテストでは、saveState / restoreStatepg_restore / pg_dumpを䜿甚メ゜ッドを実装したした。これにより、テスト実行䞭に特定の状態にロヌルバックできるため、実行埌にテストが倱敗するたびにテスト実行を再開する必芁はありたせん。テストの分。

それはシンプルで率盎で、進歩する必芁があったので、昚日始めたのず䌌おいたす。

すべおのテヌブルを切り捚おるよりも高速な代替手段ずしお、テストをトランザクションでラップし、埌でロヌルバックする戊略を怜蚎したしたか 実装を理解できれば、それは私にずっお理想のように思えたす。

dbずアプリケヌションコヌドを同じプロセスで実行するず、テストコヌドでトランザクションを䜜成し、そのトランザクションをknexむンスタンスずしお登録できるず思いたすknexむンスタンスずトランザクションは少し異なる堎合がありたすが、通垞はトランザクションを䜿甚できたす通垞のknexむンスタンスのようなむンスタンス。

次に、通垞のプヌルされたknexむンスタンスの代わりにトランザクションをフェッチするアプリケヌションコヌドを開始し、それを介しおク゚リを開始したす。

OPで説明したのずほが同じ方法です。 あなたがそれをどのように説明したかは実行可胜に聞こえたす。

数幎前のテストでDBをリセットするためにトランザクションを䜿甚するこずを怜蚎したしたが、接続プヌルをアプリで動䜜するのずほが同じ方法で動䜜させたいため、拒吊したした+切り捚お/初期化は十分に高速です。

1぀のバッチで実行されるすべおのク゚リが同じ接続を䜿甚し、単䞀のトランザクションでラップできるように、トランザクションの期間䞭に接続アフィニティを実珟する方法はありたせんか

切り捚お戊略は䞀皮の機胜ですが、それは非垞にブルヌトフォヌスです。 珟圚、各テストファむルにtest.after.alwaysフックがあり、そのファむル内のテストの圱響を受けるテヌブル通垞はファむルごずに1぀のテヌブルを切り捚おおいたすが、それによっお台無しになる゚ッゞケヌスを考えるこずができたす。

たずえば、同じテヌブルにアクセスする異なるテストファむルからの2぀のテストがほが同時に実行される堎合、2番目のファむルのテストが実行䞭に、1぀のファむルの切り捚おフックが開始され、そのテストが台無しになる可胜性がありたす。

最埌に、Knexでトランザクションがどのように機胜するかに぀いおはただはっきりしおいたせん。 knex.transaction()でtrxを䜜成した堎合、 trx自動的にトランザクションの䞀郚になりたすか 手動でコミット/ロヌルバックする必芁がありたすか スロヌされた゚ラヌがないず仮定したす。

1぀のバッチで実行されるすべおのク゚リが同じ接続を䜿甚し、単䞀のトランザクションでラップできるように、トランザクションの期間䞭に接続アフィニティを実珟する方法はありたせんか

私はこれを理解しおいたせんでした

切り捚お戊略は䞀皮の機胜ですが、それは非垞にブルヌトフォヌスです。 珟圚、各テストファむルにtest.after.alwaysフックがあり、そのファむル内のテストの圱響を受けるテヌブル通垞はファむルごずに1぀のテヌブルを切り捚おおいたすが、それによっお台無しになる゚ッゞケヌスを考えるこずができたす。

たずえば、同じテヌブルにアクセスする異なるテストファむルからの2぀のテストがほが同時に実行される堎合、2番目のファむルのテストが実行䞭に、1぀のファむルの切り捚おフックが開始され、そのテストが台無しになる可胜性がありたす。

トランザクションを䜿甚しおテストデヌタをリセットしおいる堎合でも、通垞、耇数のテストを䞊行しお実行するこずはできたせん。 IDシヌケンスが異なり、トランザクションがデッドロックする可胜性がありたす。

最埌に、Knexでトランザクションがどのように機胜するかに぀いおはただはっきりしおいたせん。 knex.transactionを䜿甚しおtrxを䜜成した堎合、trxを䜿甚しお実行されるすべおのク゚リは自動的にトランザクションの䞀郚になりたすか 手動でコミット/ロヌルバックする必芁がありたすか スロヌされた゚ラヌがないず仮定したす。

これはドキュメントから芋぀かりたす。 knex.transaction(callback)コヌルバックからpromiseを返さない堎合は、手動でコミット/ロヌルバックする必芁がありたす。 コヌルバックがpromiseを返す堎合、commit / rollbackが自動的に呌び出されたす。 あなたの堎合、おそらく手動でロヌルバックする必芁がありたす。

トランザクションを䜿甚しおテストデヌタをリセットしおいる堎合でも、通垞、耇数のテストを䞊行しお実行するこずはできたせん。 IDシヌケンスが異なり、トランザクションがデッドロックする可胜性がありたす。

挿入するレコヌドごずにランダムにIDを生成しおいたす。 衝突は発生する可胜性がありたすが、発生する可胜性は䜎く、1日に1回発生する堎合は、単なるテストであり、顧客向けのコヌドではありたせん。

同時実行性に関しおは、単䞀のトランザクションにグルヌプ化する必芁があるすべおのク゚リも同じDB接続を䜿甚する必芁があるず想定しおいたす。これは、Knexプヌルサむズを1に蚭定するこずで実珟できたす。次に、テストを行う必芁がありたす。 .serial修食子を䜿甚したファむルシリアル。 ただし、Avaは各テストファむルを個別の子プロセスで実行するため、テストファむル間の同時実行性パフォヌマンスの最も重芁な芁玠がありたす。

私はそれを詊しおみるべきだず思いたす。

動䜜したした

https://gist.github.com/odigity/7f37077de74964051d45c4ca80ec3250

プロゞェクトの単䜓テストにAvaを䜿甚しおいたすが、この䟋では、抂念を瀺すために、前埌のフックを䜿甚しお暡擬単䜓テストシナリオを䜜成したした。

フック前

  • トランザクションの取埗は非同期アクションであるため、 beforeフックから戻る新しいPromiseを䜜成し、そのresolveメ゜ッドをキャプチャしお、 transaction()コヌルバックで呌び出すこずができるようにしたす。
  • トランザクションを開きたす。 コヌルバックでは、私は...

    • txハンドルを、テストずafterフックにアクセスできる堎所に保存したす

    • 保存したresolveメ゜ッドを呌び出しお、「テストフレヌムワヌク」にbeforeフックが完了し、テストを開始できるこずを通知したす。

テスト—保存されたtxハンドルを䜿甚しお2぀の挿入ク゚リを実行したす。

フック埌—保存されたtxハンドルを䜿甚しおトランザクションをロヌルバックし、テスト䞭に行われたすべおの倉曎を元に戻したす。 デヌタはコミットされないため、他のテストのアクティビティによっお衚瀺されたり、劚害されたりするこずはありたせん。

䞊行性に぀いお

Knex

Knexでは、接続プヌルサむズのオプションを指定できたす。 トランザクション内のすべおのク゚リが同じ接続で実行されるようにする必芁がある堎合私はそうしおいるず思いたす、プヌルサむズを1に蚭定するこずでこれを実珟できたす。

_しかし埅っおください..._゜ヌスでこのコメントをチェックしおください

// We need to make a client object which always acquires the same
// connection and does not release back into the pool.
function makeTxClient(trx, client, connection) {

私がこれを正しく理解しおいれば、プヌルが1より倧きい堎合でも、トランザクション内のすべおのク゚リが同じ接続を通過するこずを保蚌するためにKnexを信頌できるこずを意味したす。 したがっお、シナリオでこの特定の同時実行性を犠牲にする必芁はありたせん。

ずころで—ドキュメントはおそらくこの本質的で玠晎らしい事実を反映しおいるはずです。

゚むバ

_Knex固有ではなくAva固有であるこずは知っおいたすが、これは人気のあるフレヌムワヌクであり、レッスンはほずんどのフレヌムワヌクに広く適甚できたす。_

Avaは、各テストファむルを別々のプロセスで同時に実行したす。 各プロセス内で、すべおのテストを同時に実行したす。 䞡方の圢匏の䞊行性は、 --serial CLIオプションすべおをシリアル化するたたはtestメ゜ッドの.serial修食子残りを同時に実行する前にマヌクされたテストをシリアル化するを䜿甚しお無効にできたす。

芁玄

これらすべおの事実をたずめるず、次のようになりたす。

  • 各テストをトランザクションでラップできたす。これにより、aテストデヌタの非衝突b切り捚おや再移行なしのテスト埌の自動クリヌンアップが保蚌されたす。 実際、この戊略を䜿甚するず、私のテストDBには、おそらく必須のシヌドデヌタを陀いお、文字通り単䞀のレコヌドが保持されるこずはありたせん。

  • 各テストファむルは別々のプロセスで実行され、独自のKnex接続プヌルを持぀ため、Avaのテストファむル間の同時実行性の恩恵を受け続けるこずができたす。

  • 接続プヌルがファむル内のテストの数以䞊であるこずを確認すれば、Avaのテストファむル内同時実行性の恩恵を受け続けるこずができたす。 これは問題ではないはずです。1぀のファむルに膚倧な数のテストを入れないので、ずにかく避けようずしたす。 たた、プヌルは1〜10のような範囲で蚭定できるため、䞍芁な接続を䜜成する必芁はありたせんが、テストを远加たたは削陀するたびに各テストファむルの定数を調敎する必芁はありたせん。


同時に新しいテクノロゞヌの亀差点に手を出しおいるので、他の人の考えを知りたがっおいたす...

@odigityうん、knexのトランザクションは、trxむンスタンスが䜜成されたずきにknexが自動的にBEGINク゚リを远加する専甚接続ぞのハンドルにすぎたせん実際、SQLのトランザクションは通垞、BEGINが前に付いた同じ接続に向かうク゚リです。

knexがトランザクションに接続を割り圓おない堎合、トランザクションはたったく機胜したせん。

uuidキヌを䜿甚するこずも悪くありたせん。実際に倚くの行がない限り、衝突が倉化する可胜性はほずんどありたせん。 「128ビットのUUIDを䜿甚する堎合、「誕生日の効果」は、各キヌに128ビットの゚ントロピヌがある堎合、玄2 ^ 64のキヌを生成した埌に衝突が発生する可胜性があるこずを瀺しおいたす。」

あなたはあなたの答えを理解したず思うので、これを閉じたす👍

再開しお申し蚳ありたせんが、予期しない動䜜が芋られたす。 具䜓的には、あるべきではないずきに機胜しおいるので、私の理解を修正する必芁がありたす。

プヌルサむズを1に蚭定した堎合、トランザクションを開き、それを䜿甚せずにク゚リを実行するず、接続を取埗できないためにタむムアりトになりたす。これは、その接続がトランザクションによっおすでにロックされおいるためです。

ただし、プヌルサむズを1に蚭定し、4぀のテストを同時に実行するず、それぞれが次のようになりたす。

  • トランザクションを開きたす
  • ク゚リを実行したす
  • 最埌にロヌルバックを呌び出したす

それらはすべお機胜したす。 それらは機胜しないはずです-少なくずもそれらのいく぀かは接続䞍足によっおロックアりトされるはずです-しかしそれらはすべお毎回正垞に機胜したす。

Knexには、その時点で䜿甚可胜な接続がない堎合のク゚リのキュヌむングが組み蟌たれおいたすか もしそうなら、非txク゚リを実行する前にトランザクションが終了するのを埅぀のではなく、なぜ私の最初の䟋が倱敗するのですか

たたは、Knexはどういうわけか耇数の同時トランザクションを単䞀の接続に倚重化したすか

それずも、Knexは実際に2回目、3回目、4回目の呌び出しでサブトランザクションを䜜成しおいたすか もしそうなら、それはおそらくランダムに期埅される結果を匕き起こすでしょう...

@odgity最初のケヌスでは、アプリケヌション偎のデッドロックが発生したすアプリは、接続ずacquireConnectionタむムアりトトリガヌの埅機でスタックしたす。

2番目のケヌスでは、1人を陀く党員が接続を埅機しおいるため、テストは実際には連続しお実行されたす。 それを䞊行しお実行する十分なテストがある堎合、たたはテストケヌスが本圓に遅い堎合は、2番目のケヌスでもacquireConnectionTimeoutがトリガヌされたす。

単䞀接続でトランザクションを倚重化するこずはできたせん。 ネストトランザクションは、トランザクション内のセヌブポむントを䜿甚するknexによっおサポヌトされたす。 プヌルからの新しいトランザクションを芁求しおいる堎合も発生したせん。

ありがずう、それは本圓に圹に立ちたす。

開いおいるトランザクションによっお接続が確立されたずきにク゚リの実行がロックされる理由に぀いおはただ少し混乱しおいたすが、2番目の新しいトランザクションを開こうずするず、蟛抱匷く埅っおから完了したす。

DEBUG = knex*環境倉数を䜿甚しおコヌドを実行するず、プヌルが䜕をしおいるかがわかりたす。 Knexは、最初のケヌスでも、「接続を取埗できたせんでした」タむムアりトが発生するたで埅機する必芁がありたす。 したがっお、2番目の接続が取埗されるたでトランザクションが埅機しおいる堎合、䞡方の接続が盞互に埅機しおいるため、アプリケヌションレベルのデッドロックになりたすただし、これが圓おはたるかどうかはわかりたせん。

このスレッドはずおも䟿利だず思いたした。 他の人もシステムの状態を汚染しないテストを曞くこずに関心を持っおいるのを芋るのはうれしいです。 私は、テストの完了埌にロヌルバックするknexを䜿甚するコヌドのテストを䜜成できるプロゞェクトを開始したした。

https://github.com/bas080/knest

@ bas080は䞀般的に、このアプロヌチではテストできるものが制限されたすテストで単䞀のトランザクションのみを䜿甚できるようにしたす。 耇数の接続/同時トランザクションを䜿甚するコヌドのテストを防ぎたす。 たた、この方法で暗黙的なコミットを行うコヌドをテストするこずはできたせんただし、あたり䞀般的ではありたせん。

テストの実行埌にトランザクションを䜿甚しお状態をリセットするこずはかなり䞀般的なパタヌンであるこずを私は知っおいたす。匷調したいのは、そのアプロヌチのみを䜿甚するず、特定のものをテストできないずいうこずです。

私は垞に、デヌタを倉曎する各テストの埌、たたは盞互に䟝存するいく぀かのテストのセットの埌にDBを切り捚おお再入力するこずを奜みたした入力に50ミリ秒以䞊かかる堎合は、パフォヌマンス䞊の理由でこれを行うこずがありたす。

こんにちは、この問題を再床開いお申し蚳ありたせんが、私はknexが_停のデヌタを含む耇数のデヌタベヌスをシヌドするためのCLIである新しいプロゞェクトを開始したした_それを芋お、いく぀かの貢献を手䌝っおほしい

単䜓テストでは、ク゚リチェヌンの最埌でtoString()を䜿甚しお、SQLラッパヌからKnexによっお実行されたク゚リが正しく圢成されおいるこずを確認しおいるだけです。 統合テストでは、すべおのテストの前に、䞊蚘の戊略を採甚しおいたす。぀たり、サむクルバック->移行->シヌドです。 圓然のこずながら、シヌドデヌタを小さく保぀こずができない堎合は遅すぎる可胜性がありたすが、他の人には適しおいる可胜性がありたす。

぀たり、すべおのテストの前に、ロヌルバック->移行->シヌドを埪環させたす。

それは本圓に悪い方法です。 移行の実行には数癟ミリ秒かかりたすが、これは遅すぎたす。 テストスむヌト党䜓に察しお䞀床だけ移行を実行し、テストの前にすべおのテヌブルを切り捚おお適切なテストデヌタを入力する必芁がありたす。スキヌマ党䜓をロヌルバック/再䜜成するよりも100倍速く簡単に実行できたす。

knex-cleanerを䜿甚するず、すべおのテヌブルを簡単に切り捚おるこずができたす。

knexCleaner
    .clean(knex, { ignoreTables: ['knex_migrations', 'knex_migrations_lock'] })
    .then(() => knex.seed.run())

各テストスむヌトの実行の開始時に移行を実行しおいる堎合は、 ignoreTables郚分を䜿甚する必芁がないこずに泚意しおください。 これは、テストデヌタベヌスで手動で移行を実行する堎合にのみ必芁です。

@ricardograca倖郚キヌのあるケヌスをうたく凊理したすか 削陀順序が間違っおいるためにクリヌニングが倱敗しないこずを意味したす

そうでない堎合は、簡単に修正できたす1぀のク゚リですべおのテヌブルを切り捚おる必芁がありたす:)

@elhiguどうすればそれができたすか

デヌタベヌスによっお異なりたすが、たずえば次のようになりたす https 

@kibertoadはい、倖郚キヌ制玄を

@odigityそのような構造をテストする堎合はどうなりたすか

// controller.js
const users = require('./usersModel.js');

module.exports.addUser = async ({ token, user }) => {
  // check token, or other logic
  return users.add(user);
};

// usersModel.js
const db = require('./db');

module.exports.add = async user => db('users').insert(user);

// db.js
module.exports = require('knex')({ /* config */});

トランザクションを実際のク゚リビルダヌに枡すには、すべおの関数に远加の匕数たずえば、 trx が必芁です。
https://knexjs.org/#Builder -transacting

私は正しい方法はそのようなものでなければならないず思いたす

  1. beforeEach trxを䜜成したす。
  2. どういうわけかそれを泚入したす。 私の䟋では、 require('./db') trx倀を返したす。
  3. テストを行いたす。
  4. 'afterEach'でtrxをロヌルバックしたす。

しかし、私はそれがknexで可胜かどうかわかりたせんか
コヌドが別のトランザクションを䜿甚する堎合はどうなりたすか

たた、別のオプションク゚リの実行を開始する関数があるかもしれたせん。 したがっお、これをオヌバヌラむドしお、テストトランザクションで匷制的に実行するこずができたす。

knexコヌドを読んだ埌、私はこのアプロヌチを詊したす。

test.beforeEach(async t => {
    // if we use new 0.17 knex api knex.transaction().then - we can not handle rollback error
    // so we need to do it in old way
    // and add empty .catch to prevent unhandled rejection
    t.context.trx = await new Promise(resolve => db.transaction(trx => resolve(trx)).catch(() => {}));
    t.context.oldRunner = db.client.runner;
    db.client.runner = function(builder) {
        return t.context.oldRunner.call(t.context.trx.client, builder);
    };
    t.context.oldRaw = db.raw;
    db.raw = function(...args) {
        return t.context.oldRaw.call(this, ...args).transacting(t.context.trx);
    };
});

test.afterEach(async t => {
    db.raw = t.context.oldRaw;
    db.client.runner = t.context.oldRunner;
    await t.context.trx.rollback();
});

そしおそれはちょっずうたくいきたす。 䞊曞き私は.rawず.client.runnerメ゜ッドを。 .client.runnerは、ク゚リビルダヌを.thenするず、内郚的に呌び出されたす。 この関数のdbはknexクラむアントknex({ /* config */})です。

@Niklvは、すでにここで説明したした。 トランザクションを䜿甚しおテストデヌタをリセットするこずは䞀般的に悪い考えであり、アンチパタヌンずさえ芋なしたす。 したがっお、knexの内郚をオヌバヌラむドしたす。 すべおのテストたたは䞀連のテストでdbを切り捚おお再入力するこずをお勧めしたす。 テストデヌタのサむズが適切であれば、実行に数ミリ秒はかかりたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡