Ich versuche, die Urllib2.urlopen-Bibliothek in einer Weise zu verspotten, dass ich unterschiedliche Antworten für verschiedene URLs erhalten sollte, die ich in die Funktion übergebe.Mocking urllib2.urlopen(). Read() für verschiedene Antworten
So wie ich es jetzt in meiner Testdatei tue, ist wie dies
@patch(othermodule.urllib2.urlopen)
def mytest(self, mock_of_urllib2_urllopen):
a = Mock()
a.read.side_effect = ["response1", "response2"]
mock_of_urllib2_urlopen.return_value = a
othermodule.function_to_be_tested() #this is the function which uses urllib2.urlopen.read
erwarte ich, dass das die othermodule.function_to_be_tested den Wert „Reaktionszeit1“ auf dem ersten Anruf und „response2“ auf dem zweiten Anruf zu erhalten, die ist das, was side_effect
aber die othermodule.function_to_be_tested tun() erhält
<MagicMock name='urlopen().read()' id='216621051472'>
und nicht die tatsächliche Antwort. Bitte geben Sie an, wo ich falsch liege oder einen einfacheren Weg.
Sie können einfach '@patch (urllib2.urlopen)' direkt patchen. –
Ich versuche, die Kopie zu patchen, die in meinem anderen Modul importiert wird. Ich denke, das ist die Art und Weise, wie es gemacht werden sollte – quirkystack
Ich würde persönlich nur meinen Code umgestalten, um nicht hardcodiert zu sein, urlib.urlopen überhaupt zu verwenden; z.B. es würde "self.urlopen_fn" aufrufen, dessen Standardwert "urllib.urlopen" ist, aber das Sie während des Testens einfach auf 'your_mock_urlopen' setzen können; Es kann sogar ein Parameter auf Modulebene sein, den Sie von außen einstellen können. –