2012-12-26 19 views
5

Próbuję użyć różnych narzędzi do kpiny i znaleźć najlepszą. Naprawdę lubię flexmock ze względu na jego prostotę, ale nie mogę wymyślić, jak pozorować zachowanie datetime.datetime.now().Kpiny z Flexmock datetime.datetime.now

Jak drwić z następujących zachowań w 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) 

Gdy próbuję sama w 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 

lub

>>>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' 

Odpowiedz

4

Twoje pierwsze podejście miał dobry pomysł, ale niestety Python nie pozwala modyfikować wbudowanych obiektów, takich jak datetime.datetime . flexmock monkey - łata obiekt i przechwytuje wywołania metod w czasie wykonywania, co nie jest możliwe w tym przypadku. Błąd w tym wyjątku wspomina o rozwiązaniu - możesz zawinąć datetime.datetime we własnej klasie, a następnie pozorować to. Ale jeśli naprawdę chcesz robić to, co Mocker zrobił w swoim przykładem i po prostu stworzyć fałszywy obiekt z teraz metodę(), która zwraca to, co chcesz, możesz to zrobić dość łatwo:

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

ale, oczywiście, regularne wywołania datetime.now() nie zostaną przechwycone przez FlexMock, chyba że wprowadziłeś fałszywy obiekt datetime do kodu wywołującego.

Twoje drugie podejście spowodowało błąd, ponieważ datetime.should_receive ('datetime.now') w flexmock jest przeznaczony do połączeń łańcuchowych metod. Co oznacza, że ​​spodziewa się wywołania jak datetime.datetime(). Now() zamiast datetime.datetime.now(), więc kończy się na skargach na temat datetime, który spodziewa się być funkcją, która nie ma teraz metody().

Powiązane problemy