标签: django-testing

如何在 Django 测试函数中添加/更改变量

这个问题可能很愚蠢,但我没有找到答案。

我想在 TestCase 的类中添加一个测试函数来检查测试的完成情况。例如,测试了 url,测试了表单等。因此,我想要一个变量来保存每个测试的记录。如果对 url 进行了测试,则 VARIABLE["urls"] = True。

不幸的是,看起来每个测试函数中的所有变量都被重置了。urls test VARIABLE["urls"] 中记录的消息不能进行其他测试。有没有办法在所有测试函数中使用全局变量?

这是修改后的工作代码

class Test(TestCase):
    test = {}
    to_be_test = ["urls","ajax","forms","templates"]

    def test_urls(self):
        ...
        self.test['urls'] = True

    def test_ajax(self):
        ...
        self.test['ajax'] = True

    def test_z_completion(self):
        for t in self.to_be_test:
            if not t in self.test:
                print "Warning: %s test is missing!" % t
Run Code Online (Sandbox Code Playgroud)

预期的结果应该是:

Warning: forms test is missing!
Warning: templates test is missing!
Run Code Online (Sandbox Code Playgroud)

python django django-testing

1
推荐指数
1
解决办法
1999
查看次数

使用Model Mommy测试登录

我在功能测试中测试登录时遇到问题.我正在使用模型妈妈用密码创建一个用户调用Megan但是我的测试仍然没有通过,因为当发送信息时它会抛出并在html页面上输入错误"请输入正确的用户名和密码.请注意两者字段可能区分大小写." 所以我怀疑测试用户没有被创建或类似的东西.

功能测试:

from django.test import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from model_mommy import mommy
from django.contrib.auth.models import User


class NewUserTest(LiveServerTestCase):

    def setUp(self):
        self.user = mommy.make('User', 
        username='Megan',
        password = 'password',
        is_active = True)

        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(15)

    def tearDown(self):
        self.browser.quit()

    def test_user_can_start_a_new_movement(self):
        #some code
        self.browser.get(self.live_server_url)
        self.assertIn('P2', self.browser.title)

        #Megan first logs in 
        login_link = self.browser.find_element_by_link_text('Log In')
        login_link.click()
        #Megan then puts in her user information
        username = self.browser.find_element_by_id('id_username')
        password = self.browser.find_element_by_id('id_password')
        submit = self.browser.find_element_by_id('id_submit')
        username.send_keys('Megan')
        password.send_keys('password')
        submit.click()
Run Code Online (Sandbox Code Playgroud)

的login.html …

django django-testing django-tests model-mommy

1
推荐指数
1
解决办法
1066
查看次数

Django测试未实现对象

我有一个 django rest 框架测试,它只是常规 django 测试的包装器,其工作方式完全相同。代码如下所示:

user_created = User.objects.create_user(first_name="Wally", username="farseer@gmail.com", password="1234",
                                            email="farseer@gmail.com")

client_created = Client.objects.create(user=user_created, cart=cart)

data_client_profile["user"]["first_name"] = "Apoc"

response = self.client.put(reverse("misuper:client_profile"), data_client_profile, format="json")

client_created.refresh_from_db()  # Tried this too

self.assertEqual(response.status_code, status.HTTP_200_OK)

self.assertEqual(client_created.user.first_name, data_client_profile["user"]["first_name"])
Run Code Online (Sandbox Code Playgroud)

所以,我要更新client_created与在字典一些数据对象data_client_profile,那么assertEqualclient.user.first_name是“载脂蛋白C”。

这是视图中的代码,我添加了两个pdb.set_trace()不仅有助于粘贴所有代码:

        pdb.set_trace()

        client_existing_user_obj.phone = phone
        client_existing_user_obj.user.email = email
        client_existing_user_obj.user.first_name = first_name # Updating here!
        client_existing_user_obj.user.last_name = last_name
        client_existing_user_obj.user.save()
        client_existing_user_obj.save()
        pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

第一个 pdb 中断显示了这一点:

(Pdb) client_existing_user_obj.user.username
u'farseer@gmail.com'  # Make sure I'm updating the created object
(Pdb) client_existing_user_obj.user.first_name …
Run Code Online (Sandbox Code Playgroud)

django django-testing django-tests

1
推荐指数
1
解决办法
1080
查看次数

工厂男孩错误:ValueError:save()禁止,以防止由于未保存的相关对象而导致数据丢失

我对遇到问题factory boy,通过搜索,我在另一个论坛中找到了描述我确切情况的帖子,但很遗憾,没有任何回复。所以我在这里发布了它,希望能对此问题做出回应:

我的测试失败,并显示一条消息,ValueError: save() prohibited to prevent data loss due to unsaved related object 'created_by' 我认为该问题与外键有关。

我尝试测试Task模型,这就是我的代码的样子

class User(AbstractUser, Entity):

    middle_name = EnglishNameCharField(_('Middle Name'), max_length=50, blank=True, null=True)
    birth_date = models.DateField(_('Date of Birth'), null=True)
    gender = models.CharField(_('Gender'), max_length=2, choices=GENDER, null=True)
    user_type= models.CharField(max_length=1, verbose_name='user type')
    balance= models.IntegerField(verbose_name='balance', default=0)


    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'email']

    @classmethod
    def hidden_fields(cls):
        fields = super(User, cls).hidden_fields()
        return fields + ('date_joined',
                     'password', 'last_login', 'is_staff',
                     'is_active', 'is_superuser')

    class Meta: …
Run Code Online (Sandbox Code Playgroud)

django django-models django-testing factory-boy

1
推荐指数
1
解决办法
644
查看次数

(admin.E116) 'list_filter[3]' 的值指的是 'groups',它不是指一个 Field

在尝试创建我自己的用户模型和管理员时,测试给出了以下错误。

: (admin.E019) 'filter_horizo​​ntal[0]' 的值指的是 'groups',它不是 'account.User' 的属性。:(admin.E019)'filter_horizo​​ntal[1]'的值指的是'user_permissions',它不是'account.User'的属性。: (admin.E116) 'list_filter[1]' 的值指的是 'is_superuser',它不是指一个 Field。: (admin.E116) 'list_filter[3]' 的值指的是 'groups',它不是指一个 Field。

模型.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class UserManager(BaseUserManager):
    def create_user(self,username,email,password=None, **extra_fields):
        user=self.model(
            username=username.lower(),
            email=self.normalize_email(email),
            **extra_fields)
        #user name is converted into lowercase
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self,username,email,password=None):
        user = self.create_user(
            username,email
        )
        user.set_password(password)
        user.is_superuser=True
        user.is_staff =True
        user.save(using=self._db)

        return user
class User(AbstractBaseUser):
    username=models.CharField(max_length=255,unique=True)
    email=models.EmailField(max_length=255,unique=True)
    password=models.CharField(max_length=255)


    is_staff =models.BooleanField(default=False)
    is_active=models.BooleanField(default=True)

    objects=UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']
Run Code Online (Sandbox Code Playgroud)

管理文件

from django.contrib import …
Run Code Online (Sandbox Code Playgroud)

django django-models django-testing

1
推荐指数
1
解决办法
3282
查看次数

测试Django代码的小片段

我仍处于Django应用程序的开发阶段.在编写我的views.py之前,我测试它们以查看我的模型是否正确定义.这是我通过调用在终端中完成的

python manage.py shell

但是哦,我经常做一些语法错误,提示我中止shell ctrl-D并重新输入所有内容.这个过程将永远持续下去.如果我能在一些文件中将所有这些写入我的试验并且如果所有的都很好地复制它会更好views.py.

这个过程是什么?它就像trial.py在我的app目录中创建一样简单.我不能导入Django环境吗?最好的方法是什么?

python django django-models django-views django-testing

0
推荐指数
1
解决办法
243
查看次数

Django Rest Framework 测试保存 POST 请求数据

我正在为我的 Django Rest Framework 编写一些测试,并试图使它们尽可能简单。之前,我使用 factory boy 创建对象,以便保存可用于 GET 请求的对象。

为什么我在测试中的 POST 请求没有在我的测试数据库中创建实际对象?使用实际 API 一切正常,但我无法在测试中获取 POST 以保存对象以使其可用于 GET 请求。有什么我想念的吗?

from rest_framework import status
from rest_framework.test import APITestCase

# from .factories import InterestFactory


class APITestMixin(object):
    """
    mixin to perform the default API Test functionality
    """
    api_root = '/v1/'
    model_url = ''
    data = {}

    def get_endpoint(self):
        """
        return the API endpoint
        """
        url = self.api_root + self.model_url
        return url

    def test_create_object(self):
        """
        create a new object
        """
        response = self.client.post(self.get_endpoint(), self.data) …
Run Code Online (Sandbox Code Playgroud)

django django-testing django-rest-framework

0
推荐指数
1
解决办法
3365
查看次数

类型对象'用户'在Django应用程序中没有属性'is_staff'

如果你看到链接,他们已经给出了该User对象有一个属性is_staff.我试图看看is_staff在单元测试中创建新用户时的默认值是什么.代码非常简单:

def test_login_user(self):
        User.objects.create_user('john', 'example@abc.edu', 'password')
        print self.client.login(username='john', password='password')
        print User.is_staff
        if User.is_staff:
            s = requests.get('http://127.0.0.1:8000/dashboard/')
        else:
            s = HttpResponseForbidden()
        print s.status_code
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试打印时print User.is_staff,它正在显示

类型对象'用户'在Django应用程序中没有属性'is_staff'

我已经知道用户不是员工用户所以输出User.is_staff应该是False对的吗?谁能指出我错在哪里?

python django django-models django-testing django-users

0
推荐指数
1
解决办法
940
查看次数

使用 ModelChoiceField 的 Django ModelForm 测试用例

我正在尝试编写一个简单的测试用例来测试允许将Orange对象分配给Apple对象的 Django 表单。

表格.py

class AppleOrangeAssignmentForm(forms.ModelForm):
    orange = forms.ModelChoiceField(required=True, \ 
                 queryset=Orange.objects.filter(apple=None))

class Meta:
    model = Apple
    fields = ('orange')
Run Code Online (Sandbox Code Playgroud)

onquerysetorange为了确保下拉列表中的值只是Orange尚未分配给其他的Apple值。该代码在调用它的视图中正确且一致地工作。

在下面的测试用例中,我创建了一个全新的,Orange以确保我有一个它没有被分配到其他地方。

测试.py

def test_apple_orange_assignment(self):
    apple = Apple.objects.get(pk=1)
    self.assertEquals(apple.orange, None)

    orange = Orange.objects.create(name='clementime')
    form_data = { 'orange': orange }
    form = AppleOrangeAssignmentForm(data=form_data, instance=apple)
    self.assertTrue(form.is_valid()) # <=== Fails here
Run Code Online (Sandbox Code Playgroud)

奇怪的是,该表单在测试用例中没有验证! form.errors说:{'orange': ['Select a valid choice. That choice is not one of the available choices.']}。当我进一步挖掘时,我可以看到orange …

django modelform django-testing

0
推荐指数
1
解决办法
1625
查看次数

在django Rest框架中编写测试用例时如何添加标题?

我正在尝试为我的项目编写测试用例。现在的问题是,我不知道如何在标头中传递自定义关键字参数。下面是我的测试用例类。

class ProjectTestClass(APITestCase,URLPatternsTestCase):

    allow_database_queries: True

    def projects_notifications_list(self,token,project_key):
        url = reverse('projects:project_noti_list',kwargs={"category": "all"})
        response = self.client.get(
            url,
            format='json', 
            HTTP_AUTHORIZATION="JWT "+token,
            headers={"platform-subscriber-id":project_key}
            )
        print("data -> ",response.data)

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(len(response.data), 3)
Run Code Online (Sandbox Code Playgroud)

如您所见,我在标头中传递了 plaform-subsciber-id 。但收到错误 {'message': '标题中需要平台订阅者 id'}。看来 id 没有在标头中正确配置。有人知道这个吗?

python django django-models django-testing django-rest-framework

0
推荐指数
1
解决办法
956
查看次数