Django在unittest期间随机地将couchbase中的单个值设置为null

时间:2016-05-10 11:28:18

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

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

我为我的一个对象编写了一个unittest,其中包含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)

我在返回时设置了一个断点,此时,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的响应处理的,根本不应该进行任何db操作。

任何想法,这可以来自哪里?

进一步的信息:

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

1 个答案:

答案 0 :(得分:0)

这有点不清楚,但听起来你正在启动一个桶上的刷新操作然后立即尝试使用它。

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