On 20/11/2010 15:59, Antoine Pitrou wrote:
Le samedi 20 novembre 2010 à 15:48 +0000, Michael Foord a écrit :
On 20/11/2010 15:42, Antoine Pitrou wrote:
On Sat, 20 Nov 2010 16:34:26 +0100 (CET)
michael.foord<python-check...@python.org>   wrote:
+
+    def testPickle(self):
+        # Issue 10326
+
+        # Can't use TestCase classes defined in Test class as
+        # pickle does not work with inner classes
+        test = unittest.TestCase('run')
+        for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
+
+            # blew up prior to fix
+            pickled_test = pickle.dumps(test, protocol=protocol)
You must also check that the object can be unpickled, otherwise
making TestCase picklable is not only pointless, but misleading the
user.  Other classes which claim to be picklable (such as e.g.
io.BytesIO) are careful to check that unpickling works fine and
produces an usable object.
Well, given the *particular* bug it is fixing, ensuring that the
TestCase instances can be pickled is enough. If they fail to unpickle
that is a bug in pickle and not in unittest.
It wouldn't be, no.  pickle provides several different APIs to ensure
that state gets correctly stored *and* restored, but it's up to
application classes such as TestCase to ensure that they implement those
APIs correctly for the intended behaviour.  Therefore, checking that
pickling "works" fine (or, rather, seems to work) is only half ot the
job.

(for example, if you define a __getstate__, chances are you must define
a __setstate__ too, and it is your job to make it work properly)

Yes, but unittest.TestCase doesn't implement any of those APIs (and if we did we would *definitely* need to test unpickling). That aside I have extended the test in the way you suggest.

Actually it would be nice to implement custom pickling / unpickling methods to allow Python 2.7 / 3.2 pickled TestCases to be unpickled on earlier versions of Python. I couldn't see how to change the class name in the pickle using the pickle protocol methods. Suggestions welcomed.

Michael

Antoine.


_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/fuzzyman%40voidspace.org.uk


--

http://www.voidspace.org.uk/

READ CAREFULLY. By accepting and reading this email you agree,
on behalf of your employer, to release me from all obligations
and waivers arising from any and all NON-NEGOTIATED agreements,
licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap,
confidentiality, non-disclosure, non-compete and acceptable use
policies (”BOGUS AGREEMENTS”) that I have entered into with your
employer, its partners, licensors, agents and assigns, in
perpetuity, without prejudice to my ongoing rights and privileges.
You further represent that you have the authority to release me
from any BOGUS AGREEMENTS on behalf of your employer.

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to