2 new commits in pytest:

https://bitbucket.org/hpk42/pytest/commits/6a5904c4816c/
Changeset:   6a5904c4816c
Branch:      issue498
User:        hpk42
Date:        2014-04-07 13:29:57
Summary:     fix issue498: if a fixture finalizer fails, make sure that the 
fixture
is still invalidated.
Affected #:  3 files

diff -r 393981dc0f1da8a2699ed4c8bc43f3644af592f9 -r 
6a5904c4816cebd3e146a4277c0ad5021b131753 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
 NEXT (2.6)
 -----------------------------------
 
+- fix issue498: if a fixture finalizer fails, make sure that 
+  the fixture is still invalidated.
+
 - fix issue453: the result of the pytest_assertrepr_compare hook now gets
   it's newlines escaped so that format_exception does not blow up.
 

diff -r 393981dc0f1da8a2699ed4c8bc43f3644af592f9 -r 
6a5904c4816cebd3e146a4277c0ad5021b131753 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1778,13 +1778,15 @@
         self._finalizer.append(finalizer)
 
     def finish(self):
-        while self._finalizer:
-            func = self._finalizer.pop()
-            func()
         try:
-            del self.cached_result
-        except AttributeError:
-            pass
+            while self._finalizer:
+                func = self._finalizer.pop()
+                func()
+        finally:
+            # even if finalization fails, we invalidate
+            # the cached fixture value
+            if hasattr(self, "cached_result"):
+                del self.cached_result
 
     def execute(self, request):
         # get required arguments and register our own finish()

diff -r 393981dc0f1da8a2699ed4c8bc43f3644af592f9 -r 
6a5904c4816cebd3e146a4277c0ad5021b131753 testing/python/fixture.py
--- a/testing/python/fixture.py
+++ b/testing/python/fixture.py
@@ -2087,6 +2087,35 @@
             "*1 error*",
         ])
 
+    def test_issue498_fixture_finalizer_failing(self, testdir):
+        testdir.makepyfile("""
+            import pytest
+            @pytest.fixture
+            def fix1(request):
+                def f():
+                    raise KeyError
+                request.addfinalizer(f) 
+                return object()
+
+            l = []
+            def test_1(fix1):
+                l.append(fix1)
+            def test_2(fix1):
+                l.append(fix1)
+            def test_3():
+                assert l[0] != l[1]
+        """)
+        result = testdir.runpytest()
+        result.stdout.fnmatch_lines("""
+            *ERROR*teardown*test_1*
+            *KeyError*
+            *ERROR*teardown*test_2*
+            *KeyError*
+            *3 pass*2 error*
+        """)
+        
+
+
     def test_setupfunc_missing_funcarg(self, testdir):
         testdir.makepyfile("""
             import pytest


https://bitbucket.org/hpk42/pytest/commits/81ac392651f5/
Changeset:   81ac392651f5
User:        RonnyPfannschmidt
Date:        2014-04-07 13:51:03
Summary:     Merged in hpk42/pytest-hpk/issue498 (pull request #151)

fix issue498: if a fixture finalizer fails, make sure that the fixture
Affected #:  3 files

diff -r c15664850085ac1b38d81b5fb3b30cd48c25f2db -r 
81ac392651f55934e99828e279c38990e76a873e CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
 NEXT (2.6)
 -----------------------------------
 
+- fix issue498: if a fixture finalizer fails, make sure that 
+  the fixture is still invalidated.
+
 - fix issue453: the result of the pytest_assertrepr_compare hook now gets
   it's newlines escaped so that format_exception does not blow up.
 

diff -r c15664850085ac1b38d81b5fb3b30cd48c25f2db -r 
81ac392651f55934e99828e279c38990e76a873e _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1778,13 +1778,15 @@
         self._finalizer.append(finalizer)
 
     def finish(self):
-        while self._finalizer:
-            func = self._finalizer.pop()
-            func()
         try:
-            del self.cached_result
-        except AttributeError:
-            pass
+            while self._finalizer:
+                func = self._finalizer.pop()
+                func()
+        finally:
+            # even if finalization fails, we invalidate
+            # the cached fixture value
+            if hasattr(self, "cached_result"):
+                del self.cached_result
 
     def execute(self, request):
         # get required arguments and register our own finish()

diff -r c15664850085ac1b38d81b5fb3b30cd48c25f2db -r 
81ac392651f55934e99828e279c38990e76a873e testing/python/fixture.py
--- a/testing/python/fixture.py
+++ b/testing/python/fixture.py
@@ -2087,6 +2087,35 @@
             "*1 error*",
         ])
 
+    def test_issue498_fixture_finalizer_failing(self, testdir):
+        testdir.makepyfile("""
+            import pytest
+            @pytest.fixture
+            def fix1(request):
+                def f():
+                    raise KeyError
+                request.addfinalizer(f) 
+                return object()
+
+            l = []
+            def test_1(fix1):
+                l.append(fix1)
+            def test_2(fix1):
+                l.append(fix1)
+            def test_3():
+                assert l[0] != l[1]
+        """)
+        result = testdir.runpytest()
+        result.stdout.fnmatch_lines("""
+            *ERROR*teardown*test_1*
+            *KeyError*
+            *ERROR*teardown*test_2*
+            *KeyError*
+            *3 pass*2 error*
+        """)
+        
+
+
     def test_setupfunc_missing_funcarg(self, testdir):
         testdir.makepyfile("""
             import pytest

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.
_______________________________________________
pytest-commit mailing list
pytest-commit@python.org
https://mail.python.org/mailman/listinfo/pytest-commit

Reply via email to