2017-02-26 7 views
0

私はタスクスケジューリングシステムの一部であるFlaskアプリケーションを持っています。多くのルートのビジネスロジックは現在の時間に依存しています。タイムスタンプに依存するFlaskアプリのユニットテストパターン?

@app.route("/do_stuff") 
def do_stuff(): 
    now = datetime.datetime.now() 
    call_func(request.args.get("some_arg"), now) 

これらの機能をテストする必要があります。テストではタイムスタンプを偽装する必要があるため、さまざまなコマンドがいつ届くかによってアプリが適切に応答することを確認できます。

Flaskにこれらの種類のテストを書くための標準パターンはありますか?私はそれを行うために、clunky、DRY以外の方法の束を考えることができます。それ以上のエレガントなパターン/ツールがあるのだろうか?

+0

一般的なFlaskテストには、 'pytest'と' pytest-flask'を使用できます。 'datetime.datetime.now()'のなりすましについては、[この回答](http://stackoverflow.com/questions/23988853/how-to-mock-set-system-date-in-pytest)を参照してください。 –

答えて

0

これは動作しますが、私は何かクリーナーを見つけるのが大好きです:

@app.route("/do_stuff") 
def do_stuff(): 
    if app.debug and request.args.get("now"): 
    now = request.args.get("now") 
    else: 
    now = datetime.datetime.now()  
    call_func(request.args.get("some_arg"), now) 

now周りにそのロジックでは、私はオプションのnow引数を渡すことができます。デバッグモードで実行している場合は、通常のロジックをオーバーライドして現在の時刻を取得できます。

1

datetime.now()を模擬実装に置き換えることができます。たとえば、Python 3には、このアプローチを実装するunittest.mockがあります。

+0

残念ながら、このプロジェクトでは2.7になっています... – Abe

+0

[Pytest](http://docs.pytest.org/en/latest/monkeypatch.html?highlight=mock)を参照してください。 – mshrbkv

+0

' pythonを使ってpython 2.7で擬似します。 –

関連する問題