[PYTHON] Mock urllib2 und unittest

Zur Erinnerung, ich blieb ein wenig hängen, als ich den Test schrieb, indem ich urllib2.urlopen () in Mock konvertierte.

Versuchen Sie es zuerst

Zu testender Code

Eigentlich ist es viel Code, aber der Einfachheit halber sieht es wie folgt aus.

target.py


import urllib2

def get(url):
	return urllib2.urlopen().read()

schlechtes Beispiel

Dies ist der erste Code, den ich leicht geschrieben habe. In einem Fall scheint es kein Problem zu geben, aber wenn Sie dies ausführen, ** wird die erste Zusicherung bestanden, aber mit der zweiten Zusicherung wird AssertionError: 'hoge'! = '' Wird auftreten und ein Fehler ** wird auftreten.

bad_test_sample.py


from nose.tools import *
from mock import Mock
from StringIO import StringIO
import urllib2
import target

def test_get():
    urllib2.urlopen = Mock(return_value=StringIO('hoge'))
	eq_('hoge', target.get("http://dummy-url"))
	eq_('hoge', target.get("http://dummy-url"))

Wenn es das erste Mal ist, tritt nach dem zweiten Mal ein Fehler auf. ?? ?? Es wird sein. Der eigentliche Test würde nicht zweimal so ausgeführt, daher sieht es zu einem scheinbar seltsamen Zeitpunkt wie ein Fehler aus. Zumindest war das meine Zeit.

Richtiges Beispiel

Zusammenfassend ist ** "Lesen ist erforderlich -> Mit StringIO erstellen" falsch **, also tu das nicht und benutze einfach Mock.

good_test_sample.py


from nose.tools import *
from mock import Mock
import urllib2
import target

def test_get():
    urllib2.urlopen = Mock()
	urllib2.urlopen.return_value.read.return_value = 'hoge'
	eq_('hoge', target.get("http://dummy-url"))
	eq_('hoge', target.get("http://dummy-url"))

Kommentar

Wenn Sie es mit StringIO übergeben, wird es sicherlich mit einer richtigen read () -Methode geliefert, aber im Gegenteil, weil es richtig ist, ** wird bei der zweiten und nachfolgenden Ausführung auf denselben Stream verwiesen, und der Zeiger befindet sich bereits am Ende * *. Nach dem zweiten Mal gibt read () also nichts mehr. Schließlich ist der Bereich um den Zeiger für einen Programmierer obligatorisch.

Recommended Posts

Mock urllib2 und unittest
spotten
Verwenden Sie Mock mit Pytest
Getestet mit boto3 + mock
Mock urllib2 und unittest
Berühre den Schein und den Stummel
[Python] Testbeispiel mit unittest2, mock
Gerätetest
Common Mock von Moto im Unit-Test von Python