Zur Erinnerung, ich blieb ein wenig hängen, als ich den Test schrieb, indem ich urllib2.urlopen () in Mock konvertierte.
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()
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.
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"))
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.