2017-07-13 6 views
1

私はdatetime.now()の出力を模擬して時間の流れをシミュレートしようとしています。ここで私がやろうとしているものです:Mocking datetime.now(); mockオブジェクトがクラスとして認識されない

from datetime import datetime, timedelta 
from mock import Mock, patch 
from other_module import some_code 

tomorrow = Mock(spec=datetime) 
tomorrow.now = Mock(return_value=datetime.now() + timedelta(days=1)) 
with patch('other_module.datetime', tomorrow): 
    some_code() 

これはsome_code()は、具体的には、datetime.datetimeのサブクラスであることを入力して確認してdatetime.datetimeクラスを取るライブラリ、croniterを、使用している以外、正常に動作します。これは私が走っている問題です。 datetime.datetimeはクラスですが、私のモックはそうではありません。 issubclassメソッドではクラス型として認識されません。

モックオブジェクトがクラスとして認識されるようにするにはどうすればよいですか?

+0

あなたのunittestsをどのように構成しているのかは分かりませんが、技術的には、あなたがunittestに影響しないように、クロニターから呼び出すクラス/メソッドを模倣する必要があります。あなたの目標は 'some_code()'を呼び出す動作をテストすることです。 – idjaw

+0

これは可能な解決策だと思いますが、これは単体テストではなく、統合テストの一部なので、できるだけ少ないものを嘲笑しようとしています – syntacticmarmalade

+0

統合テストの模擬は非常に奇妙なようです。いくつかの時間制約を強制する統合テストに役立つ時間を操作しようとしていますか? – idjaw

答えて

3

私はcroniterに慣れていないんだけど、freezegunsome_code()内、いずれかのdatetime.datetimesfreezegun.api.FakeDatetimeのインスタンスを使用する必要がありますので、それは、freezegun.api.FakeDatetimeのインスタンスとdatetime.datetimeへのすべての参照をパッチthis-に役立つかもしれません。経験から言えば、freezegunを使用すると時間の経過をシミュレートしようとすると、断続的なテストの失敗で頭痛の種をたくさん節約できます。

from datetime import datetime, timedelta 
from freeze_gun import freeze_time 
from other_module import some_code 

fake_today = datetime.datetime(2017, 7, 11) 
with_freeze_time(fake_today): 
    some_code() 
# simulate passage of time to tomorrow 
with_freeze_time(fake_today + timedelta(days=1)) 
    some_code() 
+1

笑。 freezegunを提案している誰かを見てうれしい! :) – idjaw

+0

恐ろしい。ありがとう – syntacticmarmalade

関連する問題