2016-06-28 20 views
0

Ich versuche meine Anfragen zu verspotten.get haben einen Statuscode von 200 und machen history[0].status_code triggern ein IndexError (da es keine Weiterleitungen gab). Ich kann status_code200 zurückgeben, aber wenn ich Geschichte mit dem gewünschten Nebeneffekt ausspioniere, wird IndexError nicht ausgelöst.Verspottung eines side_effect mit Python unittest

@patch('requests.get') 
def test_no_redirect(self, mock_requests): 
    mock_requests.return_value.status_code = 200 
    mock_requests.history[0].status_code.side_effect = IndexError() 

    response = requests.get('example.com') 

    self.assertRaises(IndexError, response.history[0].status_code)    
    self.assertTrue(200, response.status_code) 
+0

Sind Sie sicher, dass Sie zuweisen sollte '' Indexerror() '' auf '' side_effect'' von '' status_code''? Mayby der Aufruf an '' Geschichte [0] '' sollte den Fehler werfen? – Kamil

+0

@Kamil danke für deinen Vorschlag, aber ich habe es versucht und es hat auch keine Ausnahme ausgelöst. – Cephlin

Antwort

1

Ok, ich habe den Code überprüft und möchte ein paar Dinge erwähnen.

Zunächst einmal assertRises Methode erhält als zweiten Parameter aufrufbar;) Seine Definition wie diese

def assertRaises(self, excClass, callableObj=None, *args, **kwargs): 

Die zweite Sache aussieht, wenn Sie status_code spotten

mock_requests.return_value.status_code = 200 

mit, warum nicht versuchen Sie das gleiche mit der Geschichte:

mock_requests.return_value.history = [] 

Wir verwenden die echte Liste statt irgendeiner Art von Spott, also denke ich, dass es noch besser ist. Die Testmethode könnte wie folgt aussehen:

@patch('requests.get') 
def test_no_redirect(self, mock_requests): 
    mock_requests.return_value.status_code = 200 
    mock_requests.return_value.history = [] 

    mock_requests.history[0].status_code.side_effect = IndexError 

    response = requests.get('example.com') 

    self.assertRaises(IndexError, lambda: response.history[0]) 
    self.assertTrue(200, response.status_code) 
+0

Also abgesehen von den asserRaises keine Callable Calling, war mein einziger Fehler, nicht vor dem Setzen der IndexError Geschichte dann richtig? – Cephlin

+1

Es scheint so :) Sie können das gleiche Ergebnis erreichen, indem Sie '' mock_requests.return_value.history .__ getitem __. Side_effect = IndexError'' anstelle von '' mock_requests.return_value.history = [] '' verwenden, aber einfache Liste ist viel lesbarer aus meiner Sicht. Einfacher Code ist fast immer besser. – Kamil