﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
21540	TestCase with multiple assertRaises fails with TransactionManagementError	Kevin Christopher Henry		"This test case:

{{{
class NameModel(models.Model):
    first_name = models.CharField(unique=True, max_length=30)
    last_name = models.CharField(unique=True, max_length=30)

# passes in 1.5
# passes with TransactionTestCase
class UniqueTestCase(TestCase):

    def setUp(self):
        NameModel.objects.create(first_name=""John"", last_name=""Doe"")

    # passes with either, but not both, of these assertRaises()
    def test_unique(self):
        self.assertRaises(IntegrityError, NameModel.objects.create, first_name=""John"", last_name=""Hancock"")
        self.assertRaises(IntegrityError, NameModel.objects.create, first_name=""A"", last_name=""Doe"")

}}}

...fails with:

{{{
======================================================================
ERROR: test_unique (example.tests.UniqueTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ""D:\Files\Documents\Programs\Trivia\assert_raises_bug\example\tests.py"", line 16, in test_unique
    self.assertRaises(IntegrityError, NameModel.objects.create, first_name=""A"", last_name=""Doe"")
  File ""C:\Program Other\Python27\Lib\unittest\case.py"", line 475, in assertRaises
    callableObj(*args, **kwargs)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\manager.py"", line 157, in create
    return self.get_queryset().create(**kwargs)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\query.py"", line 319, in create
    obj.save(force_insert=True, using=self.db)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\base.py"", line 545, in save
    force_update=force_update, update_fields=update_fields)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\base.py"", line 573, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\base.py"", line 654, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\base.py"", line 687, in _do_insert
    using=using, raw=raw)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\manager.py"", line 232, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\query.py"", line 1511, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\models\sql\compiler.py"", line 898, in execute_sql
    cursor.execute(sql, params)
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\backends\util.py"", line 47, in execute
    self.db.validate_no_broken_transaction()
  File ""C:\PythonEnv\Trivia\lib\site-packages\django\db\backends\__init__.py"", line 365, in validate_no_broken_transaction
    ""An error occurred in the current transaction. You can't ""
TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.
}}}

I assume the problem here is that the `TestCase` method is being run as a transaction, but the individual `assertRaises()` are not themselves using atomic transactions to run the passed-in code.
"	Bug	new	Testing framework	dev	Normal			chris.jerdonek@… Ülgen Sarıkavak	Accepted	0	0	0	0	0	0
