Pytest-django: on_commitサポート

作成日 2019年07月27日  ·  4コメント  ·  ソース: pytest-dev/pytest-django

pytest-djangoに、django_db(transaction = True)マークを必要としないon_commitサポートがあればいいのですが、おそらくこのようなものです。
https://medium.com/gitux/speed-up-django-transaction-hooks-tests-6de4a558ef96

enhancement help wanted

最も参考になるコメント

on_commitmytask.delay() on_commit呼び出すシナリオをテストするためのFWIWでは、次のようにon_commitパッチを適用することで、タスクの呼び出しを検証できました。

with mock.patch('mypackage.tasks.mytask.delay') as mock_task_delay:
    with mock.patch('mypackage.models.transaction.on_commit', new=lambda fn: fn()):
        mymodel.save()
        assert mock_task_delay.call_count == 1
        ...

全てのコメント4件

私の特定のユースケースでは、タスクシステムはコミット時にタスクを送信します。 したがって、トランザクションでエラーが発生した場合、関連するタスクは実行されません。
テストでは、キューに入れられたイベントの一部またはすべてを実行するヘルパーがいます。
それらのヘルパーでは、トランザクション中に失敗するアサーションもあります。これは、テストに参加していることをキャッチするために存在しますが、トランザクションテストには参加していません。に姿を消した。

transaction = Trueの場合と同じ場所でon_commitコードを実行するdjango_dbバリアントがあると便利です。 また、transaction = Falseとほぼ同等のパフォーマンスがあれば、どこでも包括的に使用できるので便利です。

on_commitmytask.delay() on_commit呼び出すシナリオをテストするためのFWIWでは、次のようにon_commitパッチを適用することで、タスクの呼び出しを検証できました。

with mock.patch('mypackage.tasks.mytask.delay') as mock_task_delay:
    with mock.patch('mypackage.models.transaction.on_commit', new=lambda fn: fn()):
        mymodel.save()
        assert mock_task_delay.call_count == 1
        ...

この問題を作成してから、 https://pypi.org/project/django-capture-on-commit-callbacks/にも出くわしました

@trawickは、呼び出しが発生したことを検証するだけの場合は、単純で効果的な解決策です。
実際にタスクコードを実行する場合、タスクがすぐにスケジュールされるという欠点があるため、テストでのタスクの実行方法によっては、トランザクションの後半で実行される操作に依存する場合、断続的に失敗する可能性があります。

Django 3.2はTestCase.captureOnCommitCallbacks追加しました。 pytest-djangoに追加するのは簡単なはずです。 django_assert_num_queriesフィクスチャをテンプレートとして使用します。

誰かがそれに取り組みたいと思ったら、私はPRを喜んでいます!

このページは役に立ちましたか?
0 / 5 - 0 評価