簡體   English   中英

Django test.py model object 實例僅限一次測試

[英]Django test.py model object instance is limited to one test

好吧,這很奇怪。 這是我的有效代碼:

測試.py

from django.test import TestCase
from django.urls import reverse, resolve
from django.utils import timezone
import datetime

from ..models import Realtor, Listing, Contact
from ..views import listing

from django.test import override_settings
from PIL import Image
from io import BytesIO
from django.core.files import File
import tempfile

def get_image_file(name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)):
    file_obj = BytesIO()
    image = Image.new("RGB", size=size, color=color)
    image.save(file_obj, ext)
    file_obj.seek(0)
    return File(file_obj, name=name)

class RealestateListingViewTest(TestCase):
    @override_settings(MEDIA_ROOT=tempfile.TemporaryDirectory(prefix='mediatest').name)
    def setUp(self):
        image_file = get_image_file
        Realtor.objects.create(name='sample_realtor', photo=get_image_file())
        Listing.objects.create(title='listing_sample', address='sample', realtor=Realtor.objects.get(pk=1), city='sample', state='sample', zipcode='1234', price='555555', bedrooms='1', bathrooms='1', garage='1', sqft='123', lot_size='123', photo_main=get_image_file(), photo_1=get_image_file(), photo_2=get_image_file(), photo_3=get_image_file(), photo_4=get_image_file(), photo_5=get_image_file(), photo_6=get_image_file())
        url = reverse('btre:listing', kwargs={'listing_id': 1})
        self.response = self.client.get(url)

    def test_listing_status_code(self):
        self.assertEquals(self.response.status_code, 200)

上面的代碼有效,但每當我添加另一個測試時,比如:

    def test_listing_url_resolves_listing_view(self):
        view = resolve('/realestate/listing/1')
        self.assertEqual(view.func, listing)

我收到此錯誤:

======================================================================
ERROR: test_listing_url_resolves_listing_view (realestate.tests.test_view_listing.RealestateListingViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\Storm\Dev\btre_project\realestate\tests\test_view_listing.py", line 35, in setUp
    Listing.objects.create(title='listing_sample', address='sample', realtor=Realtor.objects.get(pk=1), city='sample', state='sample', zipcode='1234', price='555555', bedrooms='1', bathrooms='1', garage='1', sqft='123', lot_size='123', photo_main=get_image_file(), photo_1=get_image_file(), photo_2=get_image_file(), photo_3=get_image_file(), photo_4=get_image_file(), photo_5=get_image_file(), photo_6=get_image_file())
  File "C:\Users\Storm\Envs\btre\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\Storm\Envs\btre\lib\site-packages\django\db\models\query.py", line 408, in get
    self.model._meta.object_name
realestate.models.Realtor.DoesNotExist: Realtor matching query does not exist.

任何人都知道如何或為什么會發生這種情況?

另請注意,只要 TestCase class 中只存在一個測試,它就可以工作,這就是為什么它對我來說很奇怪。

我也嘗試過這種方法來創建圖像文件:

class RealestateListingViewTest(TestCase):
    @staticmethod
    def get_image_file(name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)):
        file_obj = BytesIO()
        image = Image.new("RGB", size=size, color=color)
        image.save(file_obj, ext)
        file_obj.seek(0)
        return File(file_obj, name=name)

您還沒有顯示您正在測試的視圖,但推測 URL 中的1是 object 的 PK。

問題是雖然每次測試后數據庫都會被清除,但序列並沒有被重置。 所以第二次在setUp方法中創建一個item,它的PK就不會是1了。

您不應該依賴特定的 ID。 將創建的項目分配給變量並使用它:

    listing = Listing.objects.create(title='listing_sample', address='sample', realtor=Realtor.objects.get(pk=1), city='sample', state='sample', zipcode='1234', price='555555', bedrooms='1', bathrooms='1', garage='1', sqft='123', lot_size='123', photo_main=get_image_file(), photo_1=get_image_file(), photo_2=get_image_file(), photo_3=get_image_file(), photo_4=get_image_file(), photo_5=get_image_file(), photo_6=get_image_file())
    url = reverse('btre:listing', kwargs={'listing_id': listing.id})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM