4

次のような要件があります。

ユーザーがサインアップするとすぐに (そして、電子メール アドレスを確認するまで待機状態になります)、「FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY」のようなセッション変数が設定されます (名前がわかりにくい場合は申し訳ありません!)。現在時刻まで8時間。

これがユーザーにどのように影響するかというと、ユーザーはサインアップしたメール アドレスを確認せずに、8 時間以内にサイトのすべての機能を実際に使用できます。8 時間後、すべてのビュー/ページに、ユーザーに確認を求める大きなバナーが表示されます。(このすべての機能は、すべてのビューに対して単一の「ensure_confirmed_user」デコレータを使用して実現されます)。

djangoの単体テストアドオン(TestCaseクラス)を使って同じ機能をテストしたいです。どうすればいいのですか?

更新: 上記のセッション変数の値 (8 時間から数秒に変更) を手動で更新する必要がありますか? または何か良い方法はありますか?

更新: これは非常識に聞こえるかもしれませんが、未来からの要求をシミュレートしたいと考えています。

4

3 に答える 3

3

一般に、製品コードが連携しない外部リソースに依存しているために単体テストが難しい場合は、それらのリソースを抽象化して、必要な動作をするダミーに置き換えることができます。

この場合、外部リソースは時間です。datetime.now() を使用する代わりに、外部時間関数を受け入れるようにコードをリファクタリングします。デフォルトで datetime.now にすることができます。次に、単体テストで、テストの進行に合わせて時間を変更できます。

これは、セッション タイムアウトを数秒に変更するよりも優れています。その場合でも、必要な効果を得るには、テストで数秒間スリープする必要があるためです。単体テストは、より頻繁に実行されるように、できるだけ速く実行する必要があります。

于 2009-08-24T11:27:16.980 に答える
0

私のsettings.pyは、djangoが本番環境で実行されているか、開発環境で実行されているかによって少し異なります。settings.py と settings_dev.py の 2 つの設定モジュールがあります。開発バージョンは次のようになります。

from settings import *

DEBUG = True

INSTALLED_APPS = tuple(list(INSTALLED_APPS) + [
            'dev_app',
            ])

これで、さまざまな方法で問題を解決できます。

  1. 両方の設定モジュールに異なる値を持つ変数を追加します。
  2. 変数を設定する場所では、DEBUG 設定の値に従って 2 つの値から選択します。DEBUG を使用して、実稼働サーバー上で単体テストを省略することもできます。

次のようにアクティブな設定モジュールを使用できます。

from django.conf.project_template import settings

if settings.DEBUG:
    ...
于 2009-08-24T20:23:16.193 に答える
0

いくつかの可能性が考えられます。テストの実行中に、変数をオーバーライドしてFIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY制限時間を短く設定します。その後、その制限時間が終了するまで待って、機能が期待どおりに機能しているかどうかを確認できます。

代わりに独自のdatetime機能を置き換えます (機能が に依存していると仮定しますdatetime)

setup_これらは、メソッドとメソッドをオーバーライドすることで実現できますteardown_test_environment

于 2009-08-24T08:06:50.083 に答える