Mock-Attribute in Python-Schein?

Ich habe eine ziemlich schwierige Zeit mit 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, aber r.ok ist ein Mock-Objekt, nicht True . Wie schockst du Attribute in Pythons mock ?

    3 Solutions collect form web for “Mock-Attribute in Python-Schein?”

    Sie müssen return_value und PropertyMock :

     with patch('requests.post') as patched_post: type(patched_post.return_value).ok = PropertyMock(return_value=True) 

    Dies bedeutet: Beim Aufruf von requests.post auf den Rückgabewert dieses Anrufs einen PropertyMock für die Eigenschaft ok , um den Wert True .

    Eine kompakte und einfache Art und Weise zu tun ist es, das Attribut new_callable patch zu verwenden, um patch zu verwenden, um PropertyMock anstelle von MagicMock zu verwenden, um das Mock-Objekt zu erstellen. Die anderen Argumente, die an patch werden, werden verwendet, um PropertyMock Objekt zu erstellen.

     with patch('requests.post', new_callable=PropertyMock, return_value=True) as mock_post: """Your test""" 

    Mit mock Version '1.0.1' wird die einfachere Syntax in der Frage erwähnt unterstützt und funktioniert wie 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 mit: (stellen Sie sicher, dass Sie installieren pytest)

     $ 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 ================= 
    Python ist die beste Programmiersprache der Welt.