[Pytest-commit] commit/pytest: 4 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Mon Jul 28 10:31:34 CEST 2014


4 new commits in pytest:

https://bitbucket.org/hpk42/pytest/commits/761d60bd87a6/
Changeset:   761d60bd87a6
Branch:      mock-unittest-252
User:        ticosax
Date:        2014-07-26 17:26:18
Summary:     Injection of fixture doesn't work when decorated with unittest.mock.patch

This is a continuation of #182
Affected #:  1 file

diff -r 853ffb854a4813a6a2f9e0ad4229dde770f6c7a8 -r 761d60bd87a6794d9a25ca48aa7dff968ffc415b testing/python/integration.py
--- a/testing/python/integration.py
+++ b/testing/python/integration.py
@@ -112,6 +112,26 @@
         reprec = testdir.inline_run()
         reprec.assertoutcome(passed=1)
 
+    def test_unittest_mock_and_fixture(self, testdir):
+        pytest.importorskip("unittest.mock")
+        testdir.makepyfile("""
+            import os.path
+            import unittest.mock
+            import pytest
+
+            @pytest.fixture
+            def inject_me():
+                pass
+
+            @unittest.mock.patch.object(os.path, "abspath",
+                                        new=unittest.mock.MagicMock)
+            def test_hello(inject_me):
+                import os
+                os.path.abspath("hello")
+        """)
+        reprec = testdir.inline_run()
+        reprec.assertoutcome(passed=1)
+
     def test_mock(self, testdir):
         pytest.importorskip("mock", "1.0.1")
         testdir.makepyfile("""


https://bitbucket.org/hpk42/pytest/commits/15115d747734/
Changeset:   15115d747734
Branch:      mock-unittest-252
User:        ticosax
Date:        2014-07-27 10:43:50
Summary:     Handle also unittest.mock

Move handling in dedicated function to isolate its logic
Affected #:  1 file

diff -r 761d60bd87a6794d9a25ca48aa7dff968ffc415b -r 15115d747734b6431805e32411fa95999402502a _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1861,6 +1861,27 @@
         return ("<FixtureDef name=%r scope=%r baseid=%r >" %
                 (self.argname, self.scope, self.baseid))
 
+def handle_mock_module_patching(function, startindex):
+    """
+    Special treatment when test_function is decorated
+    by mock.patch
+    """
+    for candidate_module_name in ('unittest.mock', 'mock'):
+        # stdlib comes first
+        try:
+            mock = sys.modules[candidate_module_name]
+        except KeyError:
+            pass
+        else:
+            for patching in getattr(function, "patchings", []):
+                if (not patching.attribute_name
+                        and patching.new is mock.DEFAULT):
+                    startindex += 1
+            break
+    else:
+        startindex += len(getattr(function, "patchings", []))
+    return startindex
+
 def getfuncargnames(function, startindex=None):
     # XXX merge with main.py's varnames
     #assert not inspect.isclass(function)
@@ -1870,13 +1891,7 @@
     if startindex is None:
         startindex = inspect.ismethod(function) and 1 or 0
     if realfunction != function:
-        mock = sys.modules.get('mock')
-        if mock is not None:
-            for patching in getattr(function, "patchings", []):
-                if not patching.attribute_name and patching.new is mock.DEFAULT:
-                    startindex += 1
-        else:
-            startindex += len(getattr(function, "patchings", []))
+        startindex = handle_mock_module_patching(function, startindex)
         function = realfunction
     argnames = inspect.getargs(py.code.getrawcode(function))[0]
     defaults = getattr(function, 'func_defaults',


https://bitbucket.org/hpk42/pytest/commits/06e38b54a90f/
Changeset:   06e38b54a90f
Branch:      mock-unittest-252
User:        ticosax
Date:        2014-07-27 12:11:39
Summary:     unittest.mock from stdlib should come last
Affected #:  1 file

diff -r 15115d747734b6431805e32411fa95999402502a -r 06e38b54a90f9f7d74f3e5a28f0c0eeac7e44835 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1866,8 +1866,10 @@
     Special treatment when test_function is decorated
     by mock.patch
     """
-    for candidate_module_name in ('unittest.mock', 'mock'):
-        # stdlib comes first
+    for candidate_module_name in ('mock', 'unittest.mock'):
+        # stdlib comes last, because mock might be also installed
+        # as a third party with upgraded version compare to
+        # unittest.mock
         try:
             mock = sys.modules[candidate_module_name]
         except KeyError:


https://bitbucket.org/hpk42/pytest/commits/7b861c1de21d/
Changeset:   7b861c1de21d
User:        hpk42
Date:        2014-07-28 10:31:31
Summary:     Merged in ticosax/pytest/mock-unittest-252 (pull request #184)

Injection of fixture doesn't work when decorated with unittest.mock.patch
Affected #:  2 files

diff -r c49801c86150891478719d8ca94505da2cf3f4e8 -r 7b861c1de21df974bf015ee9b254bf266d73d300 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1861,6 +1861,29 @@
         return ("<FixtureDef name=%r scope=%r baseid=%r >" %
                 (self.argname, self.scope, self.baseid))
 
+def handle_mock_module_patching(function, startindex):
+    """
+    Special treatment when test_function is decorated
+    by mock.patch
+    """
+    for candidate_module_name in ('mock', 'unittest.mock'):
+        # stdlib comes last, because mock might be also installed
+        # as a third party with upgraded version compare to
+        # unittest.mock
+        try:
+            mock = sys.modules[candidate_module_name]
+        except KeyError:
+            pass
+        else:
+            for patching in getattr(function, "patchings", []):
+                if (not patching.attribute_name
+                        and patching.new is mock.DEFAULT):
+                    startindex += 1
+            break
+    else:
+        startindex += len(getattr(function, "patchings", []))
+    return startindex
+
 def getfuncargnames(function, startindex=None):
     # XXX merge with main.py's varnames
     #assert not inspect.isclass(function)
@@ -1870,13 +1893,7 @@
     if startindex is None:
         startindex = inspect.ismethod(function) and 1 or 0
     if realfunction != function:
-        mock = sys.modules.get('mock')
-        if mock is not None:
-            for patching in getattr(function, "patchings", []):
-                if not patching.attribute_name and patching.new is mock.DEFAULT:
-                    startindex += 1
-        else:
-            startindex += len(getattr(function, "patchings", []))
+        startindex = handle_mock_module_patching(function, startindex)
         function = realfunction
     argnames = inspect.getargs(py.code.getrawcode(function))[0]
     defaults = getattr(function, 'func_defaults',

diff -r c49801c86150891478719d8ca94505da2cf3f4e8 -r 7b861c1de21df974bf015ee9b254bf266d73d300 testing/python/integration.py
--- a/testing/python/integration.py
+++ b/testing/python/integration.py
@@ -112,6 +112,26 @@
         reprec = testdir.inline_run()
         reprec.assertoutcome(passed=1)
 
+    def test_unittest_mock_and_fixture(self, testdir):
+        pytest.importorskip("unittest.mock")
+        testdir.makepyfile("""
+            import os.path
+            import unittest.mock
+            import pytest
+
+            @pytest.fixture
+            def inject_me():
+                pass
+
+            @unittest.mock.patch.object(os.path, "abspath",
+                                        new=unittest.mock.MagicMock)
+            def test_hello(inject_me):
+                import os
+                os.path.abspath("hello")
+        """)
+        reprec = testdir.inline_run()
+        reprec.assertoutcome(passed=1)
+
     def test_mock(self, testdir):
         pytest.importorskip("mock", "1.0.1")
         testdir.makepyfile("""

Repository URL: https://bitbucket.org/hpk42/pytest/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.


More information about the pytest-commit mailing list