Django Rest Framework测试是否使用" mock"数据库?

时间:2018-01-26 22:35:17

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

我正在尝试提供测试仅POST端点的最佳方法,该端点获取有效负载并从该数据创建6个不同的对象。我试图发送有效负载,然后断言应创建所有应创建的对象。最后一个块(在新行之后)尝试重新发布相同的负载并确保没有创建重复项。

我的问题是,如果我运行此测试,是否使用现有数据库?或者它是否设置了一个" mock"数据库并在测试运行后将其拆除?我不希望任何这些数据弄脏我的数据库。

class APITests(APITestCase):
    def test_job_start(self):
        url = '/api/v1/job_start/'
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(Platform.objects.count(), 1)
        self.assertEqual(Platform.objects.get().name, 'andr')
        self.assertEqual(CdTool.objects.count(), 1)
        self.assertEqual(CdTool.objects.get().name, 'https://jenkins-andr.test.com')
        self.assertEqual(Job.objects.count(), 1)
        self.assertEqual(Job.objects.get().name, 'ANDR_master_CI')
        self.assertEqual(JobExecution.objects.count(), 1)
        self.assertEqual(JobExecution.objects.get().build_id, '3500')


        # Send the same payload, make sure no duplicate records are created
        response = self.client.post(url, data, format='json')
        self.assertEqual(Platform.objects.count(), 1)
        self.assertEqual(CdTool.objects.count(), 1)
        self.assertEqual(Job.objects.count(), 1)
        self.assertEqual(JobExecution.objects.count(), 1)

1 个答案:

答案 0 :(得分:1)

1)来自官方Django documentation

  

需要数据库的测试(即模型测试)不会使用您的“真实”(生产)数据库。为测试创建单独的空白数据库。无论测试是通过还是失败,测试数据库都会在执行完所有测试后被销毁。

2)您的APITestCase扩展TestCase,根据docs

  

另一方面,TestCase在测试后不会截断表。相反,它将测试代码包含在测试结束时回滚的数据库事务中。可以由transaction.atomic()引起的显式提交(如event.commit()和隐式提交)替换为nop操作。这可以保证测试结束时的回滚将数据库恢复到初始状态。

相关问题