4.3遵守“不测试常量”规则,使用模板解决这个问题+django测试客户端

我的githup 代码获取https://github.com/brw123/TDD-note

在https://blog.csdn.net/weixin_43147867/article/details/86495504这一章节我写的单元测试中查找了特定的HTML字符串
4.3.1
单元测试规则: 不测试常量,以文本的形式测试Html很大程度上就是测试常量
单元测试要测试的应该是什么呢?
答: 是逻辑、流程控制和配置
我们在3.7 中直接在python 中插入了原始字符串处理Html,是不对的,应该放在.html 文件
这一章节主要讲了使用Django 的模板系统 (django 原先只支持使用自己的模板系统,他现在也支持其他的模板框架,我工作的时候有时候考虑到性能就会替换成jinja2 )
重构概念: 就是在功能不变的前提下改进代码
**重构首要原则:**不能没有测试
重构时修改代码或者测试,不能同时修改,
重构时要一步步来,不要直接几步走完再进行测试,要走一步就测试
重构和功能调整分开来进行

现在我们就要对我们的视图进行重构
将原来写在python 中的字符串
在这里插入图片描述
放进新建的home.htm 中
在这里插入图片描述
然后修改视图函数
def home_page(request):
return render(request,‘home.html’)
运行测试得到结果
在这里插入图片描述
解读追踪:
1、错误提示无法找到模板
2、测试视图HTml 失败
在这里插入图片描述
3、调用home_page 失败
在这里插入图片描述
4、在调用render 时中断
在这里插入图片描述
无法找到模板的原因:我们在django 中注册应用,在setting.py 中注册一下(这个问题一开始就可以避免,我们startapp 后 直接就注册一下。)
解决完这个问题我们接着运行测试
结果:很明显是我们的断言那里有问题
在这里插入图片描述使用打印repr(html) 查看一下返回对象是什么样的,发现前面有一些空格符
在这里插入图片描述
我们把这些空格去掉
self.assertTrue(html.strip().endswith(’’))
再运行结果 重构完成
在这里插入图片描述

4.3.2 Django测试客户端
测试是否正确渲染模板的方法一种是在测试中手动渲染模板,然后与返回结果对比
因此 Django 提供了 render_to_string 函数
我们可以调用它然后与 html 进行断言对比

 def test_home_page_returns_correct_html(self):
        request = HttpRequest()
        response = home_page(request)
        html = response.content.decode('utf-8')
        self.assertTrue(render_to_string('home.html',html))

Django提供测试客户端(Test Client)检查使用那个模板的原生方式。
def test_home_page_returns_correct_html(self):
found = resolve("/")
html = response.content.decode(‘utf-8’)
self.assertTrue(html.startswith(’’))
self.assertIn(“To-Do list”,html)
self.assertTrue(html.strip.endswith(’’))
self.asserTemplateUsed(response,‘home.html’)
#asserTemplateUsed 是django TestCase 提供的测试方法,用于检测响应是使用那个模板渲染的

现在根据上面 学到的精简测试代码:
class HomePageTest(TestCase):
def test_uses_home_template(self):
response= self.client.get(’/’)
self.assertTemplateUsed(response,“home.html”)
到这里我其实是有疑问的,断言为什么也删除掉了
作者在这里重新又说了一遍: 不要测试常量,应该测试实现方式
我突然明白了哈哈我们的单元测试规则

猜你喜欢

转载自blog.csdn.net/weixin_43147867/article/details/86508252