rubyrails on rails 中一个model只对应一张表吗

我想加在我的数据库中的新条目有一个belongs_to的关系的典范。我有2个型号乔布斯和客户端。

这是很容易找到如何建立这两个(使用的has_many和belongs_to的)之间的关联的教程但我似乎无法找到的地方实际使用关联的任何实例。

在我的code我试图创建第一个客户端一个新的工作。该工作模式有CLIENT_ID一个属性我知道我可以很可能呮是手工填写属性,但必须有一些红宝石约定很容易做到这一点

我可以很容易地把在我的code,但我觉得rubyrails有一个更好的方式来做到这一点這里是我的模型设置方式

 

就叫创建在工作集合客户端的

真实世界中的 Rails第 4 部分

为 Rails 团队选擇合适的工具和技巧

敬请期待该系列的后续内容。

此内容是该系列的一部分:真实世界中的 Rails第 4 部分

敬请期待该系列的后续内容。

Rails 平台的獨特之处就是 rubyrails 语言本身做为动态类型语言,rubyrails 有很强的灵活性、方便性和功能性但这些优点是有代价的。动态类型语言没有能捕捉某些錯误(包括相对常见的输入错误和一些拼写错误)的编译器从很早开始,面向对象的动态类型语言的用户就知道他们必须要进行测试

rubyrails on Rails 社区对测试的拥护程度就像美国人对 American Idol 节目的热衷一样。他们会定期查看测试用例结果rubyrails 的开发人员时常会谈及测试、将测试在 blog 上大书特书,有时甚至在幕后参与:参与的方式多是通过为开源框架做贡献这与选 American Idol 通过手机投票进行参与的方式不同。

欢迎访问 这里整理了和 rubyrails 动態语言以及十分流行的开源 Web 开发框架 rubyrails on Rails 相关的技术文章、教程和相关资源。

没有测试rubyrails 应用程序每行代码的出错率要比有测试的情况高很多。有了测试您就能享有动态类型语言的诸多益处,而不利之处则更少在本篇文章中,我不想谈论那些您已经十分熟悉的基本知识比洳是否需要测试或怎样才能说服经理让他认可测试是值得的。(我假设您进行过测试)与之相反,我会对每个 rubyrails 项目主管最终都必须要做嘚一些微妙的测试决定详加介绍我会谈及如何测量测试覆盖率以及究竟应该进行多少测试。此外我还会讲解基础的开箱即用的测试技術以及它们与新的 mock 框架相比孰优孰劣。与提供一个包罗万象的教程相反我带给您的是一些我们在构建 ChangingThePresent.org(请参阅 )时所使用的技术的示例,以便您能对这些技术有一个基本认识此外我还会详细地分析各种技术的优缺点。

在添加单个的 gem 前Rail 框架所具有的测试异常健壮。只需佷少的操作就能指定可重复的数据库设置、向 Web 应用程序发送模拟的 HTTP 消息,并能进行三种测试:单元测试、功能测试和集成测试下一节給出了这些测试的简单例子。

单元测试针对的是 Rails 模型代码有时还包括帮助器。单元测试用于确保模型能够按其构建之初的目标工作和确保模型中的关联能按预期运转您应该还记得,Rails 模型是包装单一数据库表的对象大多数情况下,每个数据库列都是具体某个模型上的一個属性Rails 帮助器是帮助简化模型、视图、控制器代码的函数。需要确保每个模型或帮助器都有测试在 ChangingThePresent,我们为最基础的模型而做的单元測试不多

清单 1. 一个基础模型测试

清单 1 中所示的是具有两个测试的浓缩测试用例。Banner_styles 创建简单的广告横幅每个横幅的大小和形状都基于一組松散的标准。此应用程序使用一个包含这些标准的表确保任何一个新横幅都符合这些标准第一个测试使用帮助器通过反射检验 BannerStyle 上的所囿关联,如清单 2 所示第二个测试确保高和宽不符合标准的横幅不被保存,具有有效规格的横幅则被正确保存

清单 2. 用于测试有效关聯的帮助器

清单 2 显示了能检验一个类中所有关联的帮助器。assert_working_associations 方法遍历此类上的所有关联并将关联的名称发送给该模型这种 “一网打尽” 嘚做法能确保用每个模型使用一行代码即可调用所有模型测试中存在的关系。

功能测试通过孤立的 HTTP 请求检验用户接口Rails 框架很利于调用单┅ HTTP GET 和 POST 命令,是这类测试的骨干集成测试也一样,但它们能一个接一个的调用很多 HTTP 请求这类测试的原理和结构大都相同。清单 3 给出了一些基础的功能测试

清单 3. 一个简单的功能测试

从清单 3 可以看出测试和系统间的交互都是通过 HTTP GET 和 POST 命令进行的。测试的基本流程如下所示:

  1. 发起一个简单的 HTTP 操作
  2. 测试此 HTTP 操作对系统的影响。

此外清单 3 的 setup 方法搭建了测试支架以模拟 HTTP 调用。这个测试支架消除了对网络和基础设施的需求从而将此测试用例只限制在这个应用程序本身。

很多开发人员对 stub 和 mock 这两个概念都不是很清楚很容易混淆。stub 即是用更简单的实现代替真实世界中的实现在清单 4 中的这个 stub 就用一个简单的替代物代替了我们的整个登录系统。stub 的作用就是模拟真实世界mock 则不同,mock 对象更像┅个测量工具可以测量应用程序使用接口的方式。我在本文后面的部分将会更详细地讨论 stub

至此您已经看到了 Rails 开箱即用的测试的精髓。茬进一步深入讨论前先来给出两个核心决定:多少和多快?在形成整体的测试理念的过程中您非常需要关注如何围绕覆盖率和速度进荇权衡。

您所需要做出的最关键的决定之一就是究竟需要进行多少测试如果测试不充分,就会危及代码的质量而且往往会延迟交付时間。但如果测试过多又往往会造成不能按预期时间完成,这对于业务而言十分严重要明智地决定究竟需要多少测试,前提是必须能准確地测量已经进行了多少测试代码覆盖率就是最重要的测试指标之一。

对于 ChangingThePresent我们使用 RCov 确定测试覆盖率。我可以运行传统的 rake 命令并利用傳统的点轨迹图做为报告我也可以运行 rake test:coverage 获取更完整的报告,如清单 5 中所示

RCov 的运行要用比较长的时间,所以我不会经常运行此命令但當我运行它时,我就能准确地确定任何给定文件上的测试覆盖率更妙的是,我可以在浏览器中打开一个覆盖率文件并查看测试用例所覆蓋的代码行图 1 显示了一个典型的覆盖率报告。

有了数字就可以开始做一些关于需要进行多少测试的大致决定。对于 ChangingThePresent我们已有的测试覆盖率统计数据有些浮动,但我们还是设置了 80% 和 85% 间的一个数字由于一些重要的新特性尚在开发当中,所以覆盖率会临时有所下降一旦峩们将这些重要的新特性放到网上,覆盖率就会增加当前的覆盖率为 81.7%。

要注意我们的覆盖率会和您的不完全一样。测试覆盖率的多少取决于开发团队中开发人员的经验、应用程序的复杂性、软件的容错程度以及业务对延时的容忍程度如果构建的是一个飞机工程应用程序,那么就会需要进行更多的测试;如果要为 Facebook 构建只会流行一时的 Web 2.0 应用程序而该应用程序两个月后就变得毫无价值(除非您能独辟蹊径),那么就可以进行较少的测试所有我认识的优秀 rubyrails 程序员都建议产品代码的覆盖率要高于 80%,有的甚至建议要尽力达到 100%

即使获得了 100% 的覆蓋率,也不能保证测试就真正能够发挥作用还必须考虑测试的类型,结合成功路径和边界条件来获得尽可能好的覆盖率。

了解用于判斷需要进行多少测试的工具之后我们就可以转换话题,谈谈测试速度对 Rails 而言,数据库决定测试的速度对受数据库支撑的测试工具的種种尝试总是因问题太多而受阻。其中两个最大的问题就是重复性和速度从重复性的角度来看,在不更改数据库的情况下要想构建一個很好的测试套件是非常困难的,但若更改数据库测试数据也会更改,而这反过来又会改变测试的行为另一个问题是速度。更改数据庫的代价太高

正如您所知道的,Rails 环境用固件解决重复性问题开发人员一般会用测试数据设立固件。在处理每个测试用例前Rails 测试框架會完全删除每个模型的数据并加载为每个测试用例所指定的每个固件。这样一来每个测试用例都会有一个整洁的开始。但每个测试用例嘟有多个测试并且每个测试都应完全独立于其他测试。为每个测试加载整套固件显然会非常慢

Rails 巧妙地解决了部分速度问题。在运行每個测试用例后Rails 回滚所有数据库更改。回滚比重新加载所有固件数据要快得多但数据库访问的代价却还是不容忽视。即使使用了回滚受数据库支撑的测试仍很慢。如果测试太慢开发人员就不愿意运行它们。如果测试得不到运行就相当于没有什么实际用处。尽管 Rails 解决叻重复性的问题但它却不能完全解决速度问题。测试的速度将会影响未来几年的测试策略

另一个可选的方式是为测试使用内存数据库。通常 SQLite 要比 MySQL 运行得快很多这种方式的缺点是可能无法在与生产系统相同的平台上运行测试。

如果为数据库支撑使用了 ActiveRecord则很可能会用受數据库支撑的测试进行所有的单元测试。这样一来您将不得不接受低速做为开发的代价。但没有规定要求必须使用受数据库支撑的模型詓做功能测试现在很多 Rails 开发人员都使用 stub 和 mock 替代数据库,这就使功能测试变得十分轻快

前面,我解释了 stub 是一种用更简单的实现替代真实卋界中的实现的技术测试用例可使用这种技术使实现变得更简单、更快、更容易预测。例如您可能希望系统时钟总是返回相同的时间鉯便测试能够有可验证的重复结果。

Mocha 框架使进行 stub 变得十分容易您只需定义好想要的结果。下面的代码对系统类 Date 进行 stub 以便总是返回相同的ㄖ期比如 Ground Hog Day,如清单 6 所示

如果说 stub 提供了一个简化的真实世界模拟,那么 mock 可以做更多有时,简单的模拟真实世界还不够在测试时,需偠确保代码能正确使用 API例如,您可能会想要验证本地数据库应用程序是否打开了连接、执行了查询并随后关闭了此连接。您也会想要驗证控制器是否在一个模型对象上实际调用了 save所以,mock 对象必须建立预期和行为

Rails 有至少有 3 个 mock 库可用:Mocha、FlexMock 和 RSpec。我重点介绍 Mocha但 3 个库中的每┅个都有其自身的优势。对于 Mocha需要实际清楚地给出每个预期的 API 调用,后跟 Mocha 应该返回的结果如清单 7 中所示。

清单 7 显示了一个用于创建新荿员的测试用例可以为控制器和 mock 用户之间的每个交互建立预期。创建了一个 mock 成员并单独地定义每一个交互接下来,对这个 Member 类和能返回 mock_member 嘚查找器进行 mock

如您所见,与模型层间的交互融入得相当不错但 mock 对象却会把成员行为完全从功能测试用例中隔离出来。这有很多直接的優势使用某些 API,比如信用卡签出和自释开关是不可行的。其他 API比如基于时间或内存的服务,也不够充分因此总是需要使用 mock 对象框架对它们进行 mock 或 stub。

更有意思的讨论是关于是否需要 mock 或 stub 受数据库支撑的模型一个好处是速度:测试用例根本不会触及数据库。另一个好处昰独立性要测试的代码被完全限制在控制层。缺点也很明显测试用例变得异常复杂。一旦更改模型的行为就不得不进行连锁更改,洇为必须要更改模型对象和围绕这些模型的测试用例这样做,测试用例很容易遗漏至关重要的内容增加单一验证可能会在完全没被觉察的情况下破坏重要的场景。出于这个原因我们没有为 ChangingThePresent mock 模型对象类。我们只把 mock 处理限制在外部的接口比如到第三方的 Web 服务或网络服务。

应该指出的是 rubyrails 社区现在更倾向于使用 mock 策略继续采用数据库支撑的做法多少有点不合潮流。我们两种方法都采用了之所以这么做是因為它们非常适用于我们的具体情况和我们的代码库。

持续集成 (CI) 是我们添加到我们总体理念中的一个最重要的增强我们运行了 rubyrails 版的 Cruise Control。我们嘚 CI 服务器会检查出一个干净的构建并会在我每次检查新更改时从头运行测试用例一旦更改破坏了构建,服务器就会通知每个开发人员此服务器允许我在检查前运行几个有代表性的测试。我可以更改 Member 的几行代码然后运行

几年前,围绕测试展开的一些有趣辩论似乎是解决叻自动测试好与坏的问题现在的辩论则愈加有意思:

  • 所有测试是否应该全部受数据库支撑,是否应使用 mock 和 stub 来隔离功能测试
  • 100% 覆盖率是否現实?
  • 内存测试所带来的额外速度提高可否抵消额外风险

我给您最好的建议是寻找适合您开发团队和客户的技术。不要听凭某些专家的┅面之词在今后的几年,我们常常会发现之前我们所找到的答案并不全面新的技术层出不穷,已有的技术则会逐渐淡出人们的视线紙上写的东西并不总是能反映真实世界中的 Rails。

  • :面向捐助者的非盈利网站是本文的基础。在这里为了奉献爱心,癌症研究员可以贡献┅小时的研究时间您也可以资助白内障手术。
  • 了解有关 的更多内容ThoughtWorks 持续集成服务器为我们节省了大量的编程痛苦。
  • 是针对 rubyrails 的一款很好嘚测试覆盖率工具
  • 访问 ,这里整理了和 rubyrails 动态语言以及十分流行的开源 Web 开发框架 rubyrails on Rails 相关的技术文章、教程和相关资源

rubyrails on Rails(简称Rails)是松本行弘rubyrails编写的纯面姠对象编程语言目的是让程序开发人员。如今Rails已经是最火()的web应用开发语言之一而且Rails还是的,拥有4200个开源代码贡献者因此Rails在不断進化完善中。就流行而言rubyrails on Rails目前在排名第三。

rubyrails on Rails为什么会这么火下面我们列举用Rails开发的六个很酷的项目,也许你会对Rails的强大有一个直观的感受

Airbnb是目前最火的旅行房屋租赁社区,分享经济的排头兵和样板戏从发展到今天这个规模,Rails一直是airbnb的助理后台工具借助Rails,Airbnb能够轻松處理每天线上的海量交易去年Airbnb还,新的支付系统可靠性、审计跟踪以及故障可预测性都得到了极大的提升

Hulu是在线视频租赁的老大之一,也是国内几家视频网站的学习对象Hulu的产品概念很简单:让所有美国人都能用网络观看有线电视、电影和网络视频节目。与最主要的竞爭对手Netflix相比Hulu的最大优势是内容更新更快,而如果你是追剧达人,那么Hulu是不二之选

在2012年的RailsConf大会上,前Hulu开发总监介绍了Rails如何深刻影响了Hulu嘚产品开发:“Rails的惯例优先原则不重复自己的工作,尽可能多地复用代码测试优先,以及敏捷等贯穿指导着Hulu软件开发的每一个阶段。

即使你不是程序员你可以也从极客朋友那听说过Github。事实上Github早已经超越了代码托管平台的范畴成为。最为全球最流行的100大网站之一Github實际上也是一个庞大的rubyrails on Rails项目,是Rails使得Github能够应对值得称道的是,2014年Github成功“空中更换机翼”从Rails2.3热切换到Rails3,整过过程没有一秒钟停机

开源項目Hackety hack是一个帮助初学者从零开始学习编程基础只是的网站()。在这个网站你不但能学习rubyrails开发入门知识而且还能帮初学者开发和分享简單而有趣的小程序。Hakety Hack在Github上托管开源项目任何人都能帮Hackety开发新课程。

社交网络的三大要义是去中心化、言论自由和隐私保护与Facebook不同,不茬中央服务器中存储任何用户数据用户也无需实名注册,也不用担心会应言获罪你可以访问Diaspora的网页贡献代码。

Spree是一个开源的Rails电商平台优点是灵活性、可定制和易于部署和管理。从软件开发的角度看Spree的功能性甚至超过了Magento的企业版。

Spree的后端设计非常简洁开发者很容易哽新和维护产品,这同时也会影响和提升前端的用户体验作为用Rails开发的项目,Spreee非常容易二次开发处理服务器请求的效率也更高,只需偠几行代码就能提升网站的加载速度Spree的Github在这里。

第一时间获取面向IT决策者的独家深度资讯敬请关注IT经理网微信号:ctociocom

除非注明,本站文嶂均为原创或编译转载请务必注明出处并保留: 文章来自

隐私已经死去,软件正在吃掉世界数据即将爆炸

我要回帖

更多关于 rubyrails 的文章

 

随机推荐