Django Nose怎么写这个测试?

Gra*_*ntU 7 python testing django unit-testing nose

我对Django的测试完全不熟悉.我已经开始安装鼻子,现在我想测试下面的代码(下面)它发送一条短信.

这是实际的代码:

views.py

@login_required
def process_all(request):
    """
    I process the sending for a single or bulk message(s) to a group or single contact.
    :param request:
    """
    #If we had a POST then get the request post values.
    if request.method == 'POST':
        batches = Batch.objects.for_user_pending(request.user)
        for batch in batches:
            ProcessRequests.delay(batch)
            batch.complete_update()

    return HttpResponseRedirect('/reports/messages/')
Run Code Online (Sandbox Code Playgroud)

那么我从哪里开始呢?这就是我到目前为止所做的......

1)创建了一个名为tests的文件夹并添加了init .py.

2)创建了一个名为test_views.py的新python文件(我假设这是正确的).

现在,我该如何编写此测试?

有人能给我看一个如何为上面的视图编写测试的例子吗?

谢谢 :)

ale*_*cxe 15

首先,您不需要selenium测试视图.Selenium是一种用于高级浏览器内测试的工具 - 当您编写模拟真实用户的UI测试时,它非常有用.

Nose是一个工具,makes testing easier通过提供自动测试发现等功能,提供了许多辅助功能等.将鼻子与django项目集成的最佳方法是使用django_nose包.你所要做的就是:

  1. 添加django_noseINSTALLED_APPS
  2. 限定 TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

然后,每次你运行python manage.py test <project_name>鼻子将用于运行你的测试.


所以,谈到测试这个特定的视图,你应该测试:

  • login_required装饰工作 - 换句话说,未经身份验证的用户将被重定向到登录页面
  • 如果request.method不是POST,则不发送消息+重定向到/reports/messages
  • 使用POST方法+重定向到时发送短信 /reports/messages

测试前两个语句是相当直接的,但为了测试你需要提供什么更细节的最后一条语句Batch,ProcessRequests以及它是如何工作的.我的意思是,您可能不希望在测试期间发送真正的SMS消息 - 这是模拟将有所帮助的地方.基本上,你需要模拟(与飞自己的实现替换)Batch,ProcessRequests对象.这是你应该拥有的一个例子test_views.py:

from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.test.client import Client
from django.test import TestCase


class ProcessAllTestCase(TestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

    def test_login_required(self):
        response = self.client.get(reverse('process_all'))
        self.assertRedirects(response, '/login')

    def test_get_method(self):
        self.client.login(username='john', password='johnpassword')
        response = self.client.get(reverse('process_all'))
        self.assertRedirects(response, '/reports/messages')

        # assert no messages were sent

    def test_post_method(self):
        self.client.login(username='john', password='johnpassword')

        # add pending messages, mock sms sending?

        response = self.client.post(reverse('process_all'))
        self.assertRedirects(response, '/reports/messages')

        # assert that sms messages were sent
Run Code Online (Sandbox Code Playgroud)

另见:

希望有所帮助.