首先,您不需要selenium
测试视图。Selenium 是一种用于高级浏览器内测试的工具 - 当您编写模拟真实用户的 UI 测试时,它非常有用。
Nose 是一个工具,它makes testing easier
通过提供自动测试发现等功能,提供许多帮助函数等。将nose 与您的django 项目集成的最佳方法是使用django_nose包。您所要做的就是:
- 添加
django_nose
到INSTALLED_APPS
- 定义
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
然后,每次你运行的python manage.py test <project_name>
鼻子都会被用来运行你的测试。
所以,谈到测试这个特定的视图,你应该测试:
- login_required装饰器工作 - 换句话说,未经身份验证的用户将被重定向到登录页面
- 如果
request.method
不是 POST,则不发送消息 + 重定向到/reports/messages
- 使用 POST 方法时发送 SMS 消息 + 重定向到
/reports/messages
测试前两个语句非常简单,但是为了测试最后一个语句,您需要提供有关什么是Batch
以及ProcessRequests
它是如何工作的更多详细信息。我的意思是,你可能不想在测试期间发送真正的 SMS 消息——这就是mock会有所帮助的地方。基本上,您需要模拟(动态替换为您自己的实现)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
另见:
希望有帮助。