【发布时间】:2021-02-24 20:46:46
【问题描述】:
当我在 Django 中使用 pytest 时,没有创建 test_
最小可重现示例:
在 Django 项目中:
./manage.py startapp testing_pytest
在models.py中
class Snippet(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
external_id = models.CharField(max_length=100, default='0')
class Meta:
ordering = ['created']
然后在 Postgres 中创建一个名为 loc_db 的数据库,
./manage.py makemigrations
./manage.py migrate
在 serializers.py 中
class BulkUpdateOrCreateListSerializer(serializers.ListSerializer):
def create(self, validated_data):
result = [self.child.create(attrs) for attrs in validated_data]
try:
res = self.child.Meta.model.objects.bulk_create(result)
except IntegrityError as e:
raise ValidationError(e)
return res
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ['id','title', 'code', 'linenos']
read_only_fields = ['id']
list_serializer_class = BulkUpdateOrCreateListSerializer
def create(self, validated_data):
instance = Snippet(**validated_data)
if isinstance(self._kwargs["data"], dict):
instance.save()
return instance
在views.py中
class SnippetGetView(generics.ListAPIView):
serializer_class = SnippetSerializer
queryset = Snippet.objects.all()
class SnippetUpdateView(generics.ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
def get_serializer(self, *args, **kwargs):
if isinstance(kwargs.get("data", {}), list):
kwargs["many"] = True
return super(SnippetUpdateView, self).get_serializer(*args, **kwargs)
在tests.py中
@pytest.fixture(scope='session',autouse=True)
def my_faker():
return Faker()
@pytest.fixture(scope='session',autouse=True)
def factory():
return APIRequestFactory()
@pytest.fixture(scope='session',autouse=True)
def snippets():
snippets = []
for i in range(TEST_SIZE):
snippets.append({'title':'snippet'+str(i),'code':'print(True)','linenos':False,'external_id':'1'})
return snippets
@pytest.mark.django_db
def test_update_snippet(factory,snippets):
request = factory.post('/add-snippets/',snippets)
view = SnippetUpdateView.as_view()
response = view(request)
response.render()
assert status.is_success(response.status_code)
在
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'loc_db',
'USER': '<some name>',
'PASSWORD': '<some pass>',
'HOST': 'localhost',
'PORT': '5432',
}
}
在 pytest.ini 中
[pytest]
DJANGO_SETTINGS_MODULE = <project_dir>.settings
python_files = tests.py test_*.py *_tests.py
我希望在执行这些测试时运行 pytest 会创建 test_loc_db,然后保存该 sn-ps 数组以进行批量创建。但是没有创建 test_db。相反,它只是通过了该测试。但我不确定为什么。那些 sn-ps 保存在哪里?
【问题讨论】: