Django Nose怎么写这个测试?

时间:2013-06-21 10:14:54

标签: python django unit-testing testing nose

我对Django中的测试完全不熟悉。我已经开始安装 nose selenium ,现在我想测试以下代码(下面)它会发送一条短信。

这是实际代码:

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/')

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

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

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

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

有人可以告诉我一个如何为上面的视图编写测试的示例吗?

谢谢:)

1 个答案:

答案 0 :(得分:15)

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

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

  1. django_nose添加到INSTALLED_APPS
  2. 定义TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
  3. 然后,每次运行python manage.py test <project_name>鼻子都将用于运行测试。


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

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

    测试前两个语句非常简单,但为了测试最后一个语句,您需要提供有关BatchProcessRequests的更多详细信息以及它是如何工作的。我的意思是,您可能不希望在测试期间发送真正的SMS消息 - 这是mocking有用的地方。基本上,您需要模拟(动态替换您自己的实现)BatchProcessRequests个对象。以下是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
    

    另见:

    希望有所帮助。