标签: django-tests

Django测试:--keepdb重置测试期间所做的更改吗?

根据有关测试的Django文档,该--keepdb标志将保留测试数据库以供将来运行.

https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---keepdb

为了清楚起见,测试(即:)的数据库是否object.save()会自动重置?或者这些变化是否需要在测试中反过来?

django django-testing django-tests

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

如何测试django中具有外键的模型?

我正在使用python 3.5和Django 1.10并试图在tests.py中测试我的应用程序,但是出现了一个错误,它说:ValueError: Cannot assign "1": "NewsLetter.UserID" must be a "User" instance.那么如何在这里测试一个fk值?这是代码:

class NewsletterModelTest(TestCase):

    @classmethod
    def setUpTestData(cls):
        #Set up non-modified objects used by all test methods
        NewsLetter.objects.create(NewsLetterID=1, Email='test@test.com', Connected=False,UserID=1)


    class NewsLetter(models.Model):
         NewsLetterID = models.AutoField(primary_key=True)
         Email = models.CharField(max_length=255)
         Connected = models.BooleanField(default=False)
         UserID = models.ForeignKey(User, on_delete=models.CASCADE)
         class Meta:
              db_table = 'NewsLetter'
Run Code Online (Sandbox Code Playgroud)

python django unit-testing python-3.x django-tests

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

Django,测试重定向到外部页面

我的 Django 应用程序中有一个路由规则,用于重定向到外部 CDN 的下载。我现在正在为我的应用程序编写测试,我想测试该路由是否成功重定向到我的 Django 设置中配置的 url。这是一个简化的示例,应该有助于解释我想要做的事情:

from django.test import SimpleTestCase
from django.test.client import Client
from django.conf import settings

class MyTestCase(SimpleTestCase):
    def setUp(self):
        self.client = Client()
    def test_download(self):
        response = self.client.get('/download/mac/')
        self.assertRedirects(response, settings.URLS.get('mac'))
Run Code Online (Sandbox Code Playgroud)

现在这不起作用,即使当我在此方法中打印 settings.DOWNLOAD_URL 时,重定向也会收到 404 错误,并且复制/粘贴到浏览器中证明它有效。我开始研究为什么它不起作用,我在 Django 源代码中注意到了这一点:

请注意,assertRedirects 不适用于外部链接,因为它使用 TestClient 来执行请求。

那么,如何测试这些重定向呢?我并不是在寻找任何超级花哨的东西,我期望检查的是响应的 status_code 和位置。我看到响应有一个跟随参数,并尝试了类似的操作,但它仍然不起作用:

    def test_download(self):
        response = self.client.get('/download/mac/', follow=True)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], settings.URLS.get('mac')
Run Code Online (Sandbox Code Playgroud)

有人要求我包含 urls.py 和views.py 中的相关部分,它们是:

# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns('myapp.views',
    url(r'^download/(?P<platform>\w+)/$', 'download_app', name='download'),
)

#views.py
from django.conf import …
Run Code Online (Sandbox Code Playgroud)

python django django-testing django-tests

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

django 1.8测试模型和迁移

我使用django 1.8我有一个模型参考django.contrib.contenttypes.ContentType:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType


class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    def __str__(self):              # __unicode__ on Python 2
        return self.tag
Run Code Online (Sandbox Code Playgroud)

我有一个tests.py:

class TestObj(models.Model):
    value = models.IntegerField(default=42, null=False)

    def __str__(self):
        text = "%s-%i" % ("name", self.value)
        return text


class MyUnitTest(TestCase):
    def setUp(self):
        TestObj.objects.create(value=40)
        TestObj.objects.create()

    def test_my_test(self):
        obj1 = TestObj.objects.get(value=40)
        obj2 = TestObj.objects.get(value=42)
        self.assertEqual(obj1.value, 40)
        self.assertEqual(obj2.value, 42)
Run Code Online (Sandbox Code Playgroud)

当我尝试在没有迁移的情况下创建数据库(以及"测试")时,我收到一个带有无效引用的错误:

./manage.py syncdb
...
django.db.utils.ProgrammingError: ERROR: reference …
Run Code Online (Sandbox Code Playgroud)

django django-models django-tests django-migrations

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

如何使用request.post执行django测试?

我有一个我喜欢测试的视图方法.我正在为数据提供self.client.get方法,但无法验证表单.我究竟做错了什么?

using django 1.8
python 3.5
Run Code Online (Sandbox Code Playgroud)

这是视图方法

def saveNewDriverInfo(request):
    if  request.user.is_authenticated():
        form = DriverForm(request.POST)  
        if  form.is_valid():
            new_Driver = form.save()
            carid = form.cleaned_data['carID']
            Car = get_object_or_404(Car, pk=carid)
            return redirect('carmanager:carDetails', carID=carid
        else:
            return HttpResponse("something went wong some where! yes i said wong!")
Run Code Online (Sandbox Code Playgroud)

这是测试方法

 def test_saveNewDriverInfo(self):
            self.client.login(username="testuser",password="testuser321")
response= self.client.get(reverse('carmanager:saveNewDriverInfo'),data={'form':{'carID':'1034567','Driver_Last_Name':'daddy','Driver_First_Name':'daddy','Driver_Middle_Initial':'K','entered_by':'king'}})
            #self.assertRedirects(response, expected_url, status_code, target_status_code, host, msg_prefix, fetch_redirect_response)

            self.assertNotContains(response, 'something went wrong' ,200)
Run Code Online (Sandbox Code Playgroud)

还要注意这个测试工作,因为它得到的反应是我得到的.但评论的行是我想要使用的

但我似乎无法将信息提供给DriverForm.任何帮助将不胜感激

python django django-tests

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

Python 单元测试任务.apply_async()

使用覆盖率来查看需要测试的内容,覆盖率显示接下来必须进行测试: send_alert.apply_async()

我知道这是芹菜任务,但是有什么方法可以测试代码行吗?

其余代码用于理解测试逻辑:

class SomeView(GenericAPIView)
    def post(self, request, *args, **kwargs):
        #some code
        if not value:
           send_alert.apply_async()
           # response
        # not if Response
Run Code Online (Sandbox Code Playgroud)

由于第一个答案而编写的测试

    @patch('event.views.send_alert')
    def test_send_alert(self, mock_send):
        data = {some data for post}
        response = self.client.post('/api/{0}/mettings/'.format(self.user), data)
        print(response.json())
        self.assertTrue(mock_send.called)
Run Code Online (Sandbox Code Playgroud)

我还检查了任务完成后的情况,print('Tasks Passed')我看到任务已通过的消息,但测试失败并出现错误AssertionError: False is not true

python django-testing celery python-unittest django-tests

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

Django 2.0 - 当我们有多个数据库时,如何仅对一个数据库进行测试?

首先,我是在这里提问的新手,所以如果我做得不完美,请耐心等待:) 这是...

我正在设置一个处理统计信息的 Django2.0 API。它显然有自己的“默认”数据库来写东西,但我将需要其他几个只读的数据库。这就是现在的设置。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dev_gpws',
        'USER': 'dev_gpws_user',
        'PASSWORD': 'gpws_pwd',
        'HOST': 'localhost',
        'PORT': '5432',
    },
    'other_db': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'other_db_name',
        'USER': 'other_db_user',
        'PASSWORD': 'other_db_pwd',
        'HOST': 'other_db_host',
        'PORT': '5432',
    },
}
Run Code Online (Sandbox Code Playgroud)

fabric 将项目部署到 staging 时,部分例程为./manage.py test,导致如下错误:

(gpws) dev_gpws@af968cdb7653:~/gpws/project$ ./manage.py test
Creating test database for alias 'default'...
Creating test database for alias 'other_db'...
Got an error creating the test database: ERREUR:  permission denied to create database
Run Code Online (Sandbox Code Playgroud)

考虑到other_db_user是只读用户,这是完全有意义的,所以我想禁用 django 对此数据库的测试。有没有干净的方法来做到这一点?此外,此统计应用程序稍后将与相当多的数据库链接,因此我宁愿使用易于扩展的解决方案。 …

django django-database django-tests

5
推荐指数
0
解决办法
218
查看次数

测试 Django 视图时出现断言错误

这是我在下面提到的 views.py 的测试功能:

def test_operation_page(self):
    url = reverse('operation')
    response = self.client.get(url)
    self.assertEqual(response.status_code, 200)
    self.assertTemplateUsed(response, 'abc.html')
    self.assertContains(response, '<b>BOOK id having certain title:</b>')
Run Code Online (Sandbox Code Playgroud)

这是我在测试视图时遇到的错误

断言错误:SimpleTestCase 子类中不允许对“默认”的数据库查询。子类化 TestCase 或 TransactionTestCase 以确保正确的测试隔离或将“默认”添加到 home.tests.TestViews.databases 以消除此故障。

这是我的views.py

def operation(request):
    queryset=Mytable.objects.filter(title="The Diary of Virginia Woolf  Volume Five: 1936-1941").values('bookid')
    textset=list(Mytable.objects.order_by('-bookid').values('title'))
    context={

    'key1' : queryset, 
    'key2' : textset
    }
    return render(request,'abc.html',context)
Run Code Online (Sandbox Code Playgroud)

这是我的 urls.py

urlpatterns = [
path('admin/', admin.site.urls),
path('',v.index,name='index'),
path('abc/',v.operation,name='operation')
Run Code Online (Sandbox Code Playgroud)

]

django django-views django-testing django-tests

5
推荐指数
2
解决办法
4453
查看次数

单元测试:如何模拟 MEDIA_ROOT 但仍然访问存储在我的普通 MEDIA 文件夹中的文件

我正在测试我的一个网页 POST 功能。if request.method == 'POST'它生成一个 pdf 并将其附加到用户。每次我运行测试时,我都会生成在我的 MEDIA 文件夹中构建的 pdf 文件,我必须手动删除它们。我决定寻找防止这种情况发生的方法,在我看来最好的方法是用临时文件覆盖我的 MEDIA_ROOT。

我收到以下错误消息

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Acer\\AppData\\Local\\Temp\\profile_pics\\default.jpg'
Run Code Online (Sandbox Code Playgroud)

我确定这是因为我必须在运行测试之前创建并登录一个用户(我不想在设置中这样做,因为我必须为不同的测试生成不同类型的用户)。每次创建用户时,他们的个人资料图片都会设置为profile_pics\\default.jpg'

我的理解是模拟的 MEDIA_ROOT 是空的,不包含默认的配置文件图片,所以会抛出错误。

我的问题是如何绕过这个(最好是模拟 default.jpg 图像)?除了模拟 MEDIA_ROOT 文件夹之外,我还找到了其他解决方案,但它们看起来很笨拙,我更喜欢正确地执行此操作,并希望从中学习。

测试.py

from django.test import override_settings
import tempfile

@override_settings(MEDIA_ROOT=tempfile.gettempdir())
def test_redirects_after_POST(self):
    user = User.objects.create_superuser('username')
    self.client.force_login(user)

    response = self.client.post(
        reverse('final_question'), data={
        'answer': 'this has me totally stumped'}
    )

    self.assertRedirects(response, reverse('page_2'))
Run Code Online (Sandbox Code Playgroud)

谢谢你。

django selenium django-testing django-tests

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

Django 测试重定向到使用下一个参数登录

我正在尝试测试非登录用户重定向到登录网址。有没有办法将获取参数(例如“next”)传递给reverse_lazy?我正在使用基于类的视图。

class SecretIndexViewTest(TestCase):
    url = reverse_lazy('secret_index')
    login_url = reverse_lazy('login')
    client = Client()

    def test_http_status_code_302(self):
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 302)
        self.assertRedirects(response, self.login_url,)
Run Code Online (Sandbox Code Playgroud)

上面失败了

Response redirected to '/login?next=/secret', expected '/login'Expected '/login?next=/secret' to equal '/login'.
Run Code Online (Sandbox Code Playgroud)

尝试过

class SecretIndexViewTest(TestCase):
    url = reverse_lazy('secret_index')
    login_url = reverse_lazy('login', kwargs={'next': url)
    client = Client()

    def test_http_status_code_302(self):
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 302)
        self.assertRedirects(response, self.login_url,)
Run Code Online (Sandbox Code Playgroud)

结果没有反向匹配

django.urls.exceptions.NoReverseMatch: Reverse for 'login' with keyword arguments '{'next': '/secret'}' not found. 1 pattern(s) tried: ['/login$']
Run Code Online (Sandbox Code Playgroud)

将 kwargs 更改为 args 将导致相同的错误。

我知道我可以用下面的方法处理它,但我正在寻找更好的解决方案。

self.assertRedirects(response, self.login_url + …
Run Code Online (Sandbox Code Playgroud)

python django django-testing django-tests

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