如何测试驱动开发
前言
最近在读《匠艺整洁之道-程序员的职业修养》这本书,作者鲍勃大叔开篇就用了大量的示例来讨论与演示为什么需要和如何操作测试驱动开发。我是之前写过测试,但从不知道测试如何驱动开发,大部分情况下也只是先写生产代码,写好后再测试,看看是否能调通,再修改代码中隐藏的问题。 而测试驱动开发会扭转这种思维方式,是先写测试,再写对应的生产代码。这一开始让人会觉得很奇怪,感觉并且很麻烦,但当你尝试一下,就会发现这事儿挺有趣,且神奇。 温馨提示:Clean Craftsmanship: Disciplines, Standards, and Ethics (Companion Videos),这个是该书示例操作的视频说明,非常非常非常有用!!! 第一篇是讲述如何通过测试驱动开发来写一个栈结构。我严重怀疑大叔是不是一边写代码一边喝啤酒。整个过程伴随大叔魔性的笑声和宛如魔法般的操作,就好像他在不停调戏编译器。你会通过这个视频感受到如何从零开始,进行测试驱动开发。 下面将讲讲一些基础知识。
为什么需要测试驱动开发?
就我目前的现状,我能感受到重构代码时的痛 ...
发布自己的GEM
生成基础文件结构bundler gem your_gem创建一个基础文件结构第一次使用时,需要配置一些默认值:
测试Creating gem 'demo_gem'...
Do you want to generate tests with your gem?
Future `bundle gem` calls will use your choice. This setting can be changed anytime with `bundle config gem.test`.
Enter a test framework. rspec/minitest/test-unit/(none)
CIDo you want to set up continuous integration for your gem? Supported services:
* CircleCI: https://circleci.com/
* GitHub Actions: https://github.com/features/actions
* GitLab CI: https: ...
RubyConf China所想
时隔三年Ruby China大会在上海再次举行,也趁着这个机会去上海逛了两天,收获许多。
Ruby在如今中国已经是一个非常小众的语言了,大家都在争先恐后的学习:
Java
Go
Python
我能想到的原因就是大部分的公司在用这些语言,大部分人在用这些语言,如果这时候你选择学习一门小众且岗位极少的语言,也就意味着你在偏离"主流",在浪费时间。当你进入一家使用小众语言的公司,你也会担心这是否会影响今后长远的发展。而当你顺应追随"主流"时,你会想我选择了一个最保险的选择,公司都在招聘它。而当所有人都这么想时,主流中便涌入大量的人力,尤其是在中国。而数量的上升,与岗位的减少,让大家只能提高自己的质量,或想想其他出路。
而主流的人越多,支流的人也就越少,小众语言的公司负责人也会因为招人难而担心后续的发展,进而选择技术转型,甚至是在最初决策时,就转向使用人数最多的语言,而不是最适合场景的语言。这也就导致了一个恶性循环,最终主流上的人更多,支流上的人更少。
在我最初学习Ruby时,是因为看了《码农翻身》《程序员修炼之道》时,作者都在提及这个优雅的语言,让 ...
Turbo Rails Tutorial-第十一章
Adding a quote total with Turbo Frames本章节中,我们将添加一个包含quote总价格的sticky bar,每当我们创建,修改,删除一个line item,总价都会被更新。
What we will build in this chapter总价格会在下面的情况中更新:
一个line item被创建,修改,删除
一个line item date被删除,而一个line item date中可能有多个items
下面的草图,将会展示我们的quote编辑器长什么样子:
现在需求明确了,敲代码吧。
**Note: **现在我们已经体验过很多次Turbo Frames了,让我们来讨论一下什么时候使用<turbo-frame> 或是 <div>
当我们需要使用Turbo去拦截点击链接或者表单提交时,我们必须使用Turbo Frame比如line_items/_line_item.html.erb局部页面的内容必须被嵌套到Turbo Frame中,因为当我们点击line item的”Edit”按钮时,我们希望Turbo ...
Turbo Rails Tutorial-第十章
Nested Turbo Frames这一章,我们为line items构建最后的增删改查代码,而line items是嵌入到line items dates中的,为此我们需要使用Turbo Frames去解决一些有趣的挑战。
What we will build in this chapter本章中,我们会大致敲定quote编辑器,通过增加line item到line item date中,每一个line item都拥有名称,可选的描述,单价,数量。
这一章的的挑战是我们将会有大量的嵌套Turbo Frames,我们将讨论如何在操作LineItemDate and LineItem增删改查时,并Quotes#show页面的状态。
在敲代码前,我们在看一下线上的示例:final quote editor,让我们创建一个quote并且进入对应的Quotes#show页面,让每位创建几个 line item dates and line items,来对我们最终的产品有一个确定的概念。
当我们清楚了最终产品的样子,我们就开始吧,我们会先不用Turbo Frames and Tu ...
Turbo Rails Tutorial-第九章
Another CRUD controller with Turbo Rails本章节中,我们将构建quotes中的日期数据的增删改查,这是一个很好的机会去练习我们之前学习的内容。
What we will build in the following three chapters现在用户可以创建,修改,删除quotes数据,是时候让我们的quotes编辑器做一些更有用的事儿。
接下来三章,我们将在Quotes#show页面中构建,当本章结束时,我们的用户可以为每个quotes添加多个日期,而每个日期里有多个条目,每个条目拥有名称,可选的描述信息,数量,单价。
在动手之前,我们可以再在线上实例中体验一下:quote editor on hotrails.dev,创建一个quote,进入Quotes#show页面,我们可以创建多个日期,并在日期里添加多个条目,当我们创建,修改,删除条目时,quote的总额也会被更新。
What we will build in this chapter我们还是在不使用Turbo Frames和Turbo Streams的前提下构建日期数据的增 ...
Turbo Rails Tutorial-第八章
Two ways to handle empty states with Hotwire本章节中,我们将会学习两种方式去使用Turbo控制空状态页,第一种使用Turbo Frames and Turbo Streams,第二种使用 the only-child CSS pseudo-class.
Adding empty states to our Ruby on Rails applications空状态页是我们系统中最重要的一部分,当我们第一次访问页面时,页面上没有任何提示让我们知道这个页面能干嘛。所以如果当一个新用户访问我们系统时,显示一点儿图片或者几句话可以更好的表达页面可以操作什么。
如果我们删除了所有的quotes数据,我们的页面也就只剩下标题和按钮了,所以当数据为空时,使用空状态页也会是一个好的选择。让我们开始吧
Empty states with Turbo Frames and Turbo Streams在敲代码之前,让我们花点儿时间,用草图描述一下将要干嘛。当一个用户没有数据时,我们想展示包含提示信息的空状态
如果用户点击header中的New qu ...
Turbo Rails Tutorial-第七章
Flash messages with Hotwire 本章节,我们将学习如何添加 flash messages 通过Turbo,并且如何通过Stimulus做出好看的动画效果。
Adding flash messages to our CRUD controller现在我们Quote模型的增删改查已经正常运转了,现在我们想添加flash message去提高系统的可用性。
在使用Turbo增加flash message之前,我们需要先来用不使用Turbo的版本,也就是Rails7之前的方式,而为了做到这一点,我们需要禁用Turbo在整个项目中。
// app/javascript/application.js
import "./controllers"
// The two following lines disable Turbo on the whole application
import { Turbo } from "@hotwired/turbo-rails"
Turbo.session.drive = false
这样我们 ...
Turbo Rails Tutorial-第六章
Turbo Streams and security
本章我们将学习如何安全的使用Turbo Stream 和 避免广播数据到非法的用户。
Understanding Turbo Streams and security在将Turbo Streams放在线上环境前,我们必须知道如何保证安全,如果把含有私密数据的HTML发送到了不该接收的人那里,这会是一个很大的问题。
让我们想象一下我们的quote编辑器被一个公司使用,公司内有很多的员工,如果有天我们的数据被一个不属于该公司的人获取到了,那这就是个很大安全事故了。
我们将使用Devise gem对用户操作,模拟现实生活来对Turbo Stream security进行学习,并且我们将展示如果我们不够足够重视,将会出现哪些安全问题。
What we will build我们将画一个草图来说明本章结束时系统的样子,我们将对没有登录的用户展示登录页面链接
然后用户通过输入用户名,密码进行登录
我们的用户在登录后跳转到首页,在导航栏中我们将根据电子邮件地址显示公司名称和用户名称,当点击View quotes按钮时,他们便可以操作 ...
Turbo Rails Tutorial-第五章
Real-time updates with Turbo Streams本章节,我们将学习如何使用Action Cable 广播 Turbo Stream templates,来让我们的页面进行实时跟新。
Turbo Stream format 可以仅用几行代码就与 Action Cable结合,来让我们的页面实时更新,当然与:群聊,通知,邮箱服务是类似的。
让我们用邮箱服务来举例,比如当我们收到一封新的邮箱,我们不想去手动的刷新让它显示,相反我们希望它能自己在页面上更新,而不需要我们操作什么。
而实现这一功能对于Rails来说很容易,因为在Rails5时就发布了Active Cable。本章将要讨论的Turbo Rails的一部分是建立在Action Cable之上的,而实现该功能,也就更加简单了。
我们要做什么来想象一下,如果有许多人同时使用我们的quote编辑器,他们更希望实时看到同事们都写了什么。
在Quotes#index页面:
任何时候一个成员创建了新的quote,我们希望该quote立刻被加到我们的quotes列表的最上面
任何时候一个成员修改了一个quot ...

