Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从django 1.5升级到1.7后测试中出现异常_Python_Django_Exception_Upgrade - Fatal编程技术网

Python 从django 1.5升级到1.7后测试中出现异常

Python 从django 1.5升级到1.7后测试中出现异常,python,django,exception,upgrade,Python,Django,Exception,Upgrade,这是一个失败的测试: def test_registering_user_twice_cause_error_msg(self): user=User(name='pyRock',email='python@rocks.com') user.save() #create the request used to test the view self.request.session = {} self.request.method = 'POST'

这是一个失败的测试:

def test_registering_user_twice_cause_error_msg(self):

    user=User(name='pyRock',email='python@rocks.com')
    user.save()

    #create the request used to test the view
    self.request.session = {}
    self.request.method = 'POST'
    self.request.POST = {
        'email':'python@rocks.com',
        'name':'pyRock',
        'stripe_token':'...',
        'last_4_digits':'4242',
        'password':'bad_password',
        'ver_password':'bad_password'
    }

    expected_form=UserForm(self.request.POST)
    expected_form.is_valid()
    expected_form.addError('python@rocks.com is already a member')

    #create the expected html
    html = render_to_response(
        'register.html',
        {
            'form': expected_form,
            'months': range(1, 12),
            'publishable': settings.STRIPE_PUBLISHABLE,
            'soon': soon(),
            'user': None,
            'years': list(range(2011, 2036)),
        }
    )

    #mock out stripe so we don't hit their server
    with mock.patch('stripe.Customer') as stripe_mock:

        config = {'create.return_value': mock.Mock()}
        stripe_mock.configure_mock(**config)

        #run the test
        resp = register(self.request)

        #verify that we did things correctly

        self.assertEqual(resp.status_code, 200)
        self.assertEqual(self.request.session, {})
        self.assertEqual(resp.content, html.content)

        #assert there is no records in the database.
        users = User.objects.filter(email="python@rocks.com")
        self.assertEqual(len(users), 1)
因此,在运行测试时,它会抛出以下内容:

ERROR: test_registering_user_twice_cause_error_msg (payments.tests.RegisterPageTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/1111/_realpython/d3/django_ecommerce/payments/tests.py", line 278, in test_registering_user_twice_cause_error_msg
    self.assertEqual(len(users), 1)
  File "/Users/1111/.virtualenvs/d317/lib/python2.7/site-packages/django/db/models/query.py", line 122, in __len__
    self._fetch_all()
  File "/Users/1111/.virtualenvs/d317/lib/python2.7/site-packages/django/db/models/query.py", line 966, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/Users/1111/.virtualenvs/d317/lib/python2.7/site-packages/django/db/models/query.py", line 265, in iterator
    for row in compiler.results_iter():
  File "/Users/1111/.virtualenvs/d317/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 700, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/Users/1111/.virtualenvs/d317/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 786, in execute_sql
    cursor.execute(sql, params)
  File "/Users/1111/.virtualenvs/d317/lib/python2.7/site-packages/django/db/backends/utils.py", line 59, in execute
    self.db.validate_no_broken_transaction()
  File "/Users/1111/.virtualenvs/d317/lib/python2.7/site-packages/django/db/backends/__init__.py", line 386, 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.
我读了一些关于Django在一个事务中完成每个测试的答案,但是我不能从中得到任何东西,因为我是Django noob,上面的代码就是教程

更有趣的是,异常发生在断言中。如果我删除它,测试通过,即使查询
users=User.objects.filter(email=”python@rocks.com”
present。但是,如果我以某种方式引用
用户
,比如只引用
打印用户
,测试将再次中断

发生了什么事

谢谢

发生了什么事

如前所述

但是,如果访问
用户
,我将分别说明它中断的原因。发生这种情况的原因是Django数据库调用是惰性的,会延迟执行,直到您最终使用查询为止

因此,如果您从未使用或迭代
用户
,它将为您节省一个数据库调用。这就是为什么它看起来像是在工作,因为如果你删除
len(users)
,它永远不需要
users的结果,所以不会查询它。

可能的重复