Rails,model层包含业务逻辑和储存逻辑。其中储存逻辑被ActiveRecord处理。

在model中,不是每件事都必须是ActiveRecord对象。model layer可以包含各种服务,对象的值,或其他封装逻辑的类并使用ActiveRecord对象来储存。

  • what can you do, 答案:type::model,没啥新东西,测试model✅
  • what makes a good Set of Model Tests?✅
  • Refactoring Models ✅
  • a Note on Assertions per Test✅简单看了
  • Testing what Rails Gives you ✅
  • Testing ActiveRecord Finders⚠️没仔细看
  • Testing Shared Modules and ActiveSupport Concerns ⚠️未看
  • Writing Your own RSpec Matchers ✅

What Makes a Good Set of Model
Tests?

write a simple test, make it pass, then refactor ,这是经典回答。

但是,这没法给你很多有用的指导或为添加一个较大的功能提供方向。

A TDD Metaprocess

  1. 测试初始状态
  2. 简化成功的路径。
  3. 替换alternate成功的路径,并反复做这个步骤
  4. Error and Edge Cases that break code, 反复做这个步骤。

1.初始状态。(此时不涉及逻辑,建立类和确定实例变量的初始状态)(如果已经现存一个类,则可以省略这部分)

2 决定一个驱动这个新的逻辑的主要案例case。有时候会有多个。需要列出表单。

3 在这些测试中,目标是让测试快速通过,然后重构。

4当主要案例通过了,可以试着找打破现存代码的可能方法。(强壮你的代码,边缘测试)

5之后移到下一步。


Refactoring Models

在TDD中,大量的设计发生在重构这步。因此重构很重要。重构让你思考你的代码如何更好。

忽略重构会让你处于危险中。

三件工作:

打破过于复杂的,整合重复的,abstractions waiting to be born. 分离那些等待出生的代码

Break up Complexity:

复杂的测试,表现在过长的方法和过长的代码。 一个好办法是提取部分代码成为自定义的方法。让方法名可读可理解。

  • 把复合的多功能的boolean逻辑表达放入它自己的方法。 如valid_name?
  • 本地变量,减少本地变量
  • 在长方法中,看到inline comments,提取,(不理解,pass)

Combine Duplication

如数字,第1章有案例。把数字提取出来变为方法,把以后会变动的数字以它的相关功能命名。

def max_point_count

5
end

重复的逻辑也需要组合,如放入一个方法中,命名一个好理解的名字。

注意不同的逻辑,可能会有类似的名字。

Find Missing Abstractions

重复的结构,意味着没有抽象。可以把一些代码放入一个新类中。

比如一堆实例属性如果总在一起使用 ,一组有相同前缀或后缀的方法。

可以写一些小类,用于储存方法。


A Note on Assertions per Test

每个测试都应该有注释说明。

aggregate_failure可以把类似的期望放在一起,一个有错误,不影响其他的测试。

it "marks a task complete" , :aggregate_failures do

...

end

也可以单独成块, aggregate_failurs do..end

Prescription

Expectations that cover different branches of the application logic

should be handled in separate specs.


Testing What Rails Gives You

Rails 提供了内置的关联和验证。

关联和validations功能是暗含在feature tests中的。我们在测试用户行为的过程中,就验证 了。


Testing ActiveRecord Finders

测试数据查找方法。

Task.where(status:
completed).order("completed_at DESC").where("size > 3").limit(5).

可以把这些查找方法提取出来,以易懂的名字来做成方法。这样今后就比较好维护和反复使用。

(文章太长,看了一遍,不翻译了。因为好多知识点,不用是不能理解的。)


Testing Shared Modules and ActiveSupport Concerns

(文章太长 ,未看)


自定义匹配器放在spec/support中,在rails_helper中,去掉注释:

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

例子:

在spec/support/size_matcher.rb中

RSpec::Matchers.define :be_of_size do |expected|

match do |actual|

actual.size == expected

end

end

RSpec::Matchers.define传递一个matcher的名字和一个block。

块带一个参数,是被期待的值。参数可以有多个。

在块内,match方法带一个块被调用,块带的参数是actual值。

在match块内,自定义代码,==等式,实际值和被期待的值的互动。相等则返回true。

expect(actual_value).to be_of_size(expected_value)

以上是基本用法。

自定义功能晚上,还有扩展的功能,

Rails 5 Test Prescriptions 第5章 Testing Models的更多相关文章

  1. Rails 5 Test Prescriptions 第10章 Testing for Security

    Web 安全是一个可怕的主题.所有的你的程序都依靠密码学,代码超出了你的控制. 尽管如此,你还是可以控制部分网页安全 --所有的logins和access checks和injection error ...

  2. Rails 5 Test Prescriptions 第14章 Testing Exteranl Services(中断。)

    external testing strategy ✅ the service integration test✅ introduce VCR✅ Client Unit Tests ❌ Why an ...

  3. Rails 5 Test Prescriptions 第8章 Integration Testing with Capybara and Cucumber

    Capybara:  A complete reference is available atrubydoc.info. 集成测试就是把局部的程序组合起来测试. 端到端测试是一个特殊的集成测试,覆盖了 ...

  4. Rails 5 Test Prescriptions 第9章 Testing-JavaScript: Integration Testing,❌挂一个问题webpacker::helper

    使用Capybara进行JS的集成测试 谈论驱动 让测试通过 Webpack in Development Mode Js设计 是用户在网页上有好的体验的重要因素. 尽管如此,许多网页不测试JS. 部 ...

  5. Rails 5 Test Prescriptions 第11章其他部分的测试。

    Routes✅ Helper Methods✅ Controllers and Requests✅ Simulating Requests⚠️,看之前的博客 What to Expect in a R ...

  6. Rails 5 Test Prescriptions 第4章 什么制造了伟大的测试

    伴随着程序成长,测试变长,复杂性增加,如何更高效的写测试,对以后开发不会造成麻烦. 测试本身没发被测试,所以一定要清楚,可控.不要加循环,不要过于复杂的自动编程. Cost and Value 成本和 ...

  7. Rails 5 Test Prescriptions 第3章Test-Driven Rails

    本章,你将扩大你的模型测试,测试整个Rails栈的逻辑(从请求到回复,使用端到端测试). 使用Capybara来帮助写end-to-end 测试. 好的测试风格,包括端到端测试,大量目标明确的单元测试 ...

  8. Rails 5 Test Prescriptions 第10章 Unit_Testing JavaScript(新工具,learn曲线太陡峭,pass)

    对Js的单元测试是一个大的题目.作者认为Ruby的相关测试工具比Js的测试工具更灵活 大多数Js代码最终是关于响应用户的行为和改变DOM中的元素 没有什么javascript的知识点.前两节用了几个新 ...

  9. Rails 5 Test Prescriptions 第6章Adding Data to Tests

    bcreate the data quickly and easily.考虑测试运行的速度. fixtures and factories.以及下章讨论的test doubles,还有原生的creat ...

随机推荐

  1. Zend_Framework_1 框架是如何被启动的?

    Zend Framework 1 是一个十年前的老框架了,我接触它也有两年了,现在来写这篇文章,主要原因是最近要写入职培训教程.公司项目基本上都是基于Zend1框架,即使现在要转 Laravel 也肯 ...

  2. Java开发环境的搭建(jdk,eclipse)

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可. http://www.orac ...

  3. 全角半角符号引发的Entity Framework奇遇记

    SQL Server的SQL查询不区分大小写,而LINQ查询区分大小写,所以在写LINQ代码时需要注意的是——如果这段LINQ代码将会被Entity Framework解析为SQL语句(LINQ to ...

  4. python面向对象(类和对象及三大特性)

    类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态   面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  5. 阿里云centos7.2 安装mysql 6.5

    [root@111 ~]# uname -aLinux bxhs 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_ ...

  6. Mysql varchar 把默认值设置为null和空的区别

    '\0',这个表示空,需要消耗存储空间的.NULL,则表示连这个\0都没有. NULL,你可以近似理解为变量未赋值(定义了变量,但是未使用,变量不指向具体存储空间,因此,理论上不消耗存储空间),同时, ...

  7. Oracle数据库的经典问题 snapshot too old是什么原因引起的

    Oracle数据库的经典问题 snapshot too old是什么原因引起的 ORACLE经典错误求解:ORA-1555错误(Snapshot too old ) - ... 书上说是因为the r ...

  8. 007-spring cache-缓存实现-02-springboot ehcahe3实现、springboot caffeine实现

    一.springboot ehcahe3实现步骤 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛 ...

  9. TCP协议通讯工作原理

    TCP协议通讯工作原理   一.TCP三次握手 传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议.面向连接是指一次正常的TCP传输需要通过在TCP ...

  10. Kconfig文件说明2

    Konfig详解: 当执行#make menuconfig时会出现内核的配置界面,所有配置工具都是通过读取"arch/$(ARCH)Kconfig"文件来生成配置界面,这个文件就是 ...