@@ -915,24 +915,46 @@ class TestCase(TransactionTestCase):
915
915
On database backends with no transaction support, TestCase behaves as
916
916
TransactionTestCase.
917
917
"""
918
+ @classmethod
919
+ def _enter_atomics (cls ):
920
+ """Helper method to open atomic blocks for multiple databases"""
921
+ atomics = {}
922
+ for db_name in cls ._databases_names ():
923
+ atomics [db_name ] = transaction .atomic (using = db_name )
924
+ atomics [db_name ].__enter__ ()
925
+ return atomics
926
+
927
+ @classmethod
928
+ def _rollback_atomics (cls , atomics ):
929
+ """Rollback atomic blocks opened through the previous method"""
930
+ for db_name in reversed (cls ._databases_names ()):
931
+ transaction .set_rollback (True , using = db_name )
932
+ atomics [db_name ].__exit__ (None , None , None )
918
933
919
934
@classmethod
920
935
def setUpClass (cls ):
921
936
super (TestCase , cls ).setUpClass ()
922
937
if not connections_support_transactions ():
923
938
return
924
- cls .cls_atomics = {}
925
- for db_name in cls ._databases_names ():
926
- cls .cls_atomics [db_name ] = transaction .atomic (using = db_name )
927
- cls .cls_atomics [db_name ].__enter__ ()
939
+ cls .cls_atomics = cls ._enter_atomics ()
940
+
941
+ if cls .fixtures :
942
+ for db_name in cls ._databases_names (include_mirrors = False ):
943
+ try :
944
+ call_command ('loaddata' , * cls .fixtures , ** {
945
+ 'verbosity' : 0 ,
946
+ 'commit' : False ,
947
+ 'database' : db_name ,
948
+ })
949
+ except Exception :
950
+ cls ._rollback_atomics (cls .cls_atomics )
951
+ raise
928
952
cls .setUpTestData ()
929
953
930
954
@classmethod
931
955
def tearDownClass (cls ):
932
956
if connections_support_transactions ():
933
- for db_name in reversed (cls ._databases_names ()):
934
- transaction .set_rollback (True , using = db_name )
935
- cls .cls_atomics [db_name ].__exit__ (None , None , None )
957
+ cls ._rollback_atomics (cls .cls_atomics )
936
958
for conn in connections .all ():
937
959
conn .close ()
938
960
super (TestCase , cls ).tearDownClass ()
@@ -955,32 +977,12 @@ def _fixture_setup(self):
955
977
return super (TestCase , self )._fixture_setup ()
956
978
957
979
assert not self .reset_sequences , 'reset_sequences cannot be used on TestCase instances'
958
-
959
- self .atomics = {}
960
- for db_name in self ._databases_names ():
961
- self .atomics [db_name ] = transaction .atomic (using = db_name )
962
- self .atomics [db_name ].__enter__ ()
963
-
964
- for db_name in self ._databases_names (include_mirrors = False ):
965
- if self .fixtures :
966
- try :
967
- call_command ('loaddata' , * self .fixtures ,
968
- ** {
969
- 'verbosity' : 0 ,
970
- 'commit' : False ,
971
- 'database' : db_name ,
972
- })
973
- except Exception :
974
- self ._fixture_teardown ()
975
- raise
980
+ self .atomics = self ._enter_atomics ()
976
981
977
982
def _fixture_teardown (self ):
978
983
if not connections_support_transactions ():
979
984
return super (TestCase , self )._fixture_teardown ()
980
-
981
- for db_name in reversed (self ._databases_names ()):
982
- transaction .set_rollback (True , using = db_name )
983
- self .atomics [db_name ].__exit__ (None , None , None )
985
+ self ._rollback_atomics (self .atomics )
984
986
985
987
986
988
class CheckCondition (object ):
0 commit comments