Ich habe eine ziemlich schwierige Zeit mock
in Python:
def method_under_test():
r = requests.post("http://localhost/post")
print r.ok # prints "<MagicMock name='post().ok' id='11111111'>"
if r.ok:
return StartResult()
else:
raise Exception()
class MethodUnderTestTest(TestCase):
def test_method_under_test(self):
with patch('requests.post') as patched_post:
patched_post.return_value.ok = True
result = method_under_test()
self.assertEqual(type(result), StartResult,
"Failed to return a StartResult.")
Der Test gibt tatsächlich den richtigen Wert zurück, r.ok
ist jedoch kein Mock-Objekt True
. Wie verspotten Sie Attribute in Pythons mock
Bibliothek?
python
unit-testing
testing
mocking
python-mock
Naftuli Kay
quelle
quelle
print
den Wert vonr.ok
von in dermethod_under_test
, sehe ich<MagicMock name='post().ok' id='57360464'>
nichtTrue
.PropertyMock
.patched_post.return_value = mock.Mock(ok=True)
?PropertyMock
, dass wie bei jedem anderenMock
Objekt darauf zugegriffen wurde . Wenn Sie der Eigenschaft nur einen Wert zuweisen, können Sie dies nicht tun.Eine kompakte und einfache Möglichkeit besteht darin,
new_callable
patch
das Attribut 'spatch
zu verwenden , um die Verwendung zu erzwingen ,PropertyMock
anstattMagicMock
das Scheinobjekt zu erstellen. Die anderen übergebenen Argumentepatch
werden zum Erstellen einesPropertyMock
Objekts verwendet.with patch('requests.post.ok', new_callable=PropertyMock, return_value=True) as mock_post: """Your test"""
quelle
Mit der Scheinversion '1.0.1' wird die in der Frage erwähnte einfachere Syntax unterstützt und funktioniert wie sie ist!
Beispielcode aktualisiert (py.test wird anstelle von unittest verwendet):
import mock import requests def method_under_test(): r = requests.post("http://localhost/post") print r.ok if r.ok: return r.ok else: raise Exception() def test_method_under_test(): with mock.patch('requests.post') as patched_post: patched_post.return_value.ok = True result = method_under_test() assert result is True, "mock ok failed"
Führen Sie diesen Code aus mit: (Stellen Sie sicher, dass Sie pytest installieren)
$ py.test -s -v mock_attributes.py ======= test session starts ======================= platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.7.2 -- /home/developer/miniconda/bin/python rootdir: /home/developer/projects/learn/scripts/misc, inifile: plugins: httpbin, cov collected 1 items mock_attributes.py::test_method_under_test True PASSED ======= 1 passed in 0.03 seconds =================
quelle
requests.post.ok
ist eine Eigenschaft und kein Attribut. Wenn Sie ein einfaches Objekt anprobieren, bei demok
es sich um ein einfaches Attribut handelt , funktioniert die in der Frage erwähnte Syntax, aber fürrequests.post.ok
Objekt NrAttributeError
.