2012-12-26 15 views
5

私は嘲笑のためにさまざまなツールを使い、最高のものを見つけようとしています。私はflexmockがとてもシンプルだと本当に好きですが、datetime.datetime.now()の動作を模擬する方法を理解することはできません。FlexMockを使ったMocking datetime.datetime.now

flexmockでの挙動を模擬する方法は?

>>> from datetime import datetime 
>>> mocker = Mocker() 
>>> fake_datetime=mocker.replace(datetime) 
>>> fake_datetime.now() 
<mocker.Mock object at 0x027F1990> 
>>> mocker.result(datetime(year=2012, month=12, day=12)) 
>>> mocker.replay() 
>>> datetime.now() 
datetime.datetime(2012, 12, 12, 0, 0) 

私はflexmockに同じ試してみてください。

>>> from datetime import datetime 
>>> fake_datetime = flexmock(datetime) 
Traceback (most recent call last): 
    File "C:\virtualenvs\webui\lib\site-packages\flexmock.py", line 1194, in flexmock 
    return _create_partial_mock(spec, **kwargs) 
    File "C:\virtualenvs\webui\lib\site-packages\flexmock.py", line 1013, in 
_create_partial_mock 
if (_attach_flexmock_methods(mock, Mock, obj_or_class) and 
    File "C:\virtualenvs\webui\lib\site-packages\flexmock.py", line 1030, in 
_attach_flexmock_methods 
'Python does not allow you to mock builtin objects or modules. ' 
    'Python does not allow you to mock builtin objects or modules. ' 
MockBuiltinError: Python does not allow you to mock builtin objects or modules. 
Consider wrapping it in a class you can mock instead 

または

>>>flexmock(datetime).should_receive('datetime.now').and_return(datetime.datetime(2012,12,10)) 
>>> datetime.datetime.now() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'function' object has no attribute 'now' 

答えて

4

あなたの最初のアプローチは正しい考えを持っていたが、残念ながらPythonはあなたがdatetime.datetimeのような組み込みオブジェクトを変更することはできません。 。 flexmockは、この場合には不可能な、実行時にオブジェクトを呼び出し、メソッド呼び出しをハイジャックします。例外のエラーは、実際には解決策を示しています。あなた自身のクラスでdatetime.datetimeをラップして、それをモックすることができます。あなたは本当にあざける者はあなたの例で行った何とちょうどあなたが欲しいものを返すになりました()メソッドで、偽のオブジェクトを作成したい場合しかし、あなたはかなり簡単にそれを行うことができます。

fake_datetime = flexmock(now=lambda: datetime(year=2012, month=12, day=12)) 

しかし、当然のを、 datetime.now()への通常の呼び出しは、偽のdatetimeオブジェクトを呼び出しコードに注入していない限り、flexmockによってハイジャックされることはありません。

flexmockのdatetime.should_receive( 'datetime.now')は、チェーンメソッド呼び出しのためのものであるため、2番目の方法ではエラーが発生しました。これは、datetime.datetime.now()ではなくdatetime.datetime()。now()のような呼び出しを期待するので、now()メソッドを持たない関数であると予想されるdatetimeについて不平を言ってしまうことになります。

関連する問題