python - 如何在 Django 功能测试中触发空值验证?
问题描述
我是django新手,现在正在看《Test-Driven Development with Python》这本书学习。但是,当我想测试空值验证时,单元测试是可以的,但是功能测试失败了。
我现在使用的是 Django 2.1,Python 3。我已尽力检查问题的原因,但仍然未能通过功能测试
模型.py
...
class Item(models.Model):
text = models.TextField(default='')
list = models.ForeignKey(List, default=None, on_delete=models.CASCADE)
视图.py
...
def new_list(request):
list_ = List.objects.create()
item = Item.objects.create(text=request.POST['item_text'],list=list_)
try:
item.full_clean()
item.save()
except ValidationError:
list_.delete()
error = "You can't have an empty list item"
return render(request, 'home.html', {"error": error})
return redirect(list_)
test_views.py(单元测试成功)
...
def test_validation_errors_are_sent_back_to_home_page_template(self):
response = self.client.post('/lists/new', data={'item_text':''})
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'home.html')
expected_error = escape("You can't have an empty list item")
self.assertContains(response, expected_error)
test_list_item_validation.py(功能测试失败)
...
def test_cannot_add_empty_list_items(self):
self.browser.get(self.live_server_url)
self.browser.find_element_by_id('id_new_item').send_keys(Keys.ENTER)
error = self.browser.find_element_by_css_selector('.has-error')
self.assertEqual(error.text, "You can't have an empty list item")
base.html(所有 html 文件都从这里扩展)
...
{% if error %}
<div class="form-group has-error">
<span class="help-block">{{ error }}</span>
</div>
{% endif %}
我期望单元测试和功能测试都正确,但实际结果是单元测试通过但功能测试失败
解决方案
很棒的书。自己读。我相信这是您缺少的部分:
def test_cannot_add_empty_list_items(self):
# Edith goes to the home page and accidentally tries to submit
# an empty list item. She hits Enter on the empty input box
self.browser.get(self.live_server_url)
self.get_item_input_box().send_keys(Keys.ENTER)
'''
If you keep reading a little farther, it should tell you that modern browsers
will not submit forms when fields that are 'required' left are blank.
'''
# The browser intercepts the request, and does not load the
# list page
self.wait_for(lambda: self.browser.find_elements_by_css_selector(
'#id_text:invalid'
))
如果您继续阅读,它应该会告诉您“forms
当字段required
留空时,现代浏览器将不会提交。它应该给你上面的代码修改。
推荐阅读
- php - 将数组作为 POST 请求参数发送到 PHP - Swift
- laravel - DELETE 方法在 PHP 变量中不起作用
- android - 我的 colors.xml 文件没有显示主题颜色。一切都是灰色的。如何解决这个问题?
- sapui5 - 使用 SAP UI5 动态呈现视图元素
- c# - 收到错误“Type Universe 无法解析程序集:System.Runtime,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a。”
- deployment - Sylius:“缓存:清除”超时
- r - 'ivreg' 代码(来自 AER 包)适用于较弱的 PC,但不适用于较强的 PC
- entity-framework-core - 实体框架核心数据迁移和在 EF 之外创建的表
- node.js - Dialogflow 中的任何 RichResponse 是否有可用的回调
- angular - 如何忽略或修复错误 TS2341:属性“myFunction”是私有的,只能在使用 Jest 24 和 Angular 8 的“MyClass”类中访问