【问题标题】:Django randomly sets a single value in couchbase to null during unittestDjango 在单元测试期间将 couchbase 中的单个值随机设置为 null
【发布时间】:2016-05-10 11:28:18
【问题描述】:

我遇到了一个非常令人困惑的问题。

我为我的一个对象编写了一个单元测试,其中包含 2 个测试用例:

# coding=utf-8
import unittest

from unittests.helper_functions import *

fix = {}

... Test Data is initialized here

check_if_test_bucket_is_used()
check_if_cb_credentials_are_set()

print "Flushing Bucket"
flush_test_bucket(CB_HOST, CB_USER, CB_PASS)

print "Starting Tests"
create_admin_user()

def testD_post_vehicle_by_driver(self):

    res_vehicle = post_data('/drivers/vehicles', valid_vehicle_0, auth_obj=None,
                             headers={'Authorization': 'WebAuth %s' % fix['token'],
                                      'Content-Type': 'application/json',
                                      'Accept': 'application/json'})

    driver = cb_find_by_key(valid_driver_0_key)
    self.assertIn(valid_obj_0_key, driver[MISSING_KEY])

    print driver

def testE_get_vehicle_by_driver(self):
    res_single_vehicle = get_data('/vehicles/12345', auth_obj=None,
                                   headers={'Authorization': 'WebAuth %s' % fix['token'],
                                            'Content-Type': 'application/json',
                                            'Accept': 'application/json'})

testDtestE 之间,密钥MISSING_KEY 从我的数据库对象中消失了。

所以当我在testD 中打印我的驱动程序对象时,仍然有一个值。在testE 中,甚至在我之前发布的获取这辆车的请求之前,Couchbase 中的值已经是null

django 视图如下:

def post(self, request):
    data = request.data
    driver = request.user.details

    vehicle = self.vehicle_bo.create_vehicle_by_driver(data, driver[m.ID])

    return content_response(vehicle, VehicleModel, request, status_code=status.HTTP_201_CREATED)

我在return那里设置了一个断点,此时db中的值还是正确的。

函数content_response

def content_response(response_obj, parser_class, request, status_code=status.HTTP_200_OK,
                 obj_modification_function=None, default='{}'):

if response_obj is None:
    return default

# some json manipulation

response = Response(prepared_obj, status=status_code, headers=get_headers(request))
return response

同样在这里返回,值仍然保持不变。

据我所知,从这一点开始,一切都由 rest_framework 的响应处理,根本不应该进行任何数据库操作。

任何人有想法,这是从哪里来的?

一些进一步的信息:

  • 在没有 unittest 框架的情况下发送所有请求不会导致 null 值
  • 在所有测试 A-E 运行之前,我正在冲洗整个沙发底桶。
  • 我正在使用 PyCharm 运行测试

【问题讨论】:

    标签: python django unit-testing django-rest-framework couchbase


    【解决方案1】:

    有点不清楚,但听起来您正在对存储桶启动刷新操作,然后立即尝试使用它。

    刷新操作需要牢记的重要一点是,它是一个 异步 事件,可能需要一些时间才能完成 - 特别是如果您使用 Couchbase 存储桶,因为它需要时间来清理磁盘上的数据。一般来说,删除存储桶并重新创建它可能会发现更可靠的行为。这可以使用 Python SDK 中的administrative API 来完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2014-02-08
      相关资源
      最近更新 更多