2014-03-07 59 views
1

這是我的Python方法:的Python:嘲諷日期時間的問題

for time in (timedelta(hours=3), timedelta(minutes=30)): 

    delay = (datetime.now() + time).strftime('%Y-%m-%dT%H:%M:%S') 
    payload = json.dumps({ 
     "channels": [ 
      "accountID-{acct_id}".format(acct_id=account_id) 
     ], 
     "push_time": delay, 
     "data": { 
      "alert": "Test Push", 
      "m": "12345" 
     }, 
    }) 

    try: 
     requests.post(
      "https://api.parse.com/1/push", 
      data=payload, 
      headers={ 
       "X-Parse-Application-Id": settings.PARSE_APPLICATION_ID, 
       "X-Parse-REST-API-Key": settings.PARSE_REST_API_KEY, 
       "Content-Type": "application/json" 
      } 
     ) 
    except requests.exceptions.RequestException as e: 
     logging.getLogger().setLevel(logging.ERROR) 

這是我的測試:

@patch("requests.post") 
def test_send_push_notifications_to_parse(self, post_mock): 
    post_mock.return_value = {"status": 200} 
    mailing = Mock() 
    mailing.name = "Foo Name" 
    mailing.account_id = 12345 
    mailing.mailing_id = 45 

    payload = json.dumps({ 
     "channels": [ 
      "accountID-12345" 
     ], 
     "push_time": "2014-03-04T15:00:00", 
     "data": { 
      "alert": "Test Push", 
      "m": "12345" 
     }, 
    }) 

    send_push_notification_to_parse(mailing.account_id, mailing.mailing_id, mailing.name) 

    post_mock.assert_called_with(
     "https://api.parse.com/1/push", 
     data=payload, 
     headers={ 
      "X-Parse-Application-Id": settings.PARSE_APPLICATION_ID, 
      "X-Parse-REST-API-Key": settings.PARSE_REST_API_KEY, 
      "Content-Type": "application/json" 
     } 
    ) 

因爲POST請求是內部循環的,其中datetime對象變化的測試失敗。我如何修補datetime對象以使我的測試通過?

回答

3

只是嘲笑datetime你的模塊在:

@patch("your.module.datetime") 
@patch("requests.post") 
def test_send_push_notifications_to_parse(self, post_mock, dt_mock): 
    # set datetime.now() to a fixed value 
    dt_mock.now.return_value = datetime.datetime(2013, 2, 1, 10, 9, 8) 

您在模塊中結合datetime與進口,而上述@patch裝飾將取代對象與模擬。

如果您需要針對多個值進行測試,您可以改爲設置dt_mock.now.side_effect attribute;一個列表將導致模擬在順序調用中從該列表中逐一返回值,一種方法可讓您在每次調用datetime.now()時根據需要生成一個新值。

+0

嗯..我不斷收到此錯誤:'不是JSON serializable'我測試的方法是在後臺作業 – dennismonsewicz

+0

@dennismonsewicz:then'datetime.now()'沒有返回你想要返回什麼(一個實際的'datetime'值)。它返回了一個'MagicMock',而後又有'__add__'調用它,等等。 –

+0

@dennismonsewicz:通常,這意味着你沒有模擬正確的'datetime'名字。 –

0

任何磕磕絆絆對這個老問題,像我可以使用freezegun,可以讓你的Python測試穿越時間(如星際:))