`
hideto
  • 浏览: 2679283 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Rails宝典之第六十式: 不用fixtures的测试

    博客分类:
  • Ruby
阅读更多
严重依赖fixtures的测试会变得十分脆弱,并且很难维护。
让我们来看看怎样写不使用fixtures的测试。

看cart/line_item的例子:
class Cart < ActiveRecord::Base
  has_many :line_items

  def total_weight
    line_items.to_s.sum(&:weight)
  end
end

class LineItem < ActiveRecord::Base
  belongs_to :cart
  belongs_to :product
  belongs_to :delivery_method

  def weight
    if delivery_method.shipping?
      product.weight*quantity
    else
      0
    end
  end
end


对简单的字段数据我们可以通过使用ActiveRecord生成的build_xxx方法给字段赋值来测试:
class LineItemTest < Test::Unit::TestCase
  def test_should_have_zero_for_weight_when_not_shipping
    line_item = LineItem.new
    line_item.build_delivery_method(:shipping => false)
    assert_equal 0, line_item.weight
  end

  def test_should_have_weight_of_product_times_quantity_when_shipping
    line_item = LineItem.new(:quantity => 3)
    line_item.build_delivery_method(:shipping => true)
    line_item.build_product(:weight => 5)
    assert equal 15, line_item.weight
  end
end

但是我们考虑下面的测试:
class CartTest < Test::Unit::TestCase
  fixtures :carts, :line_items, :delivery_methods, :products

  def test_total_weight
    assert_equal 10, carts(:primary).total_weight
  end
end

这里我们手动准备cart/line_item数据会非常麻烦,而且total_weight依赖于line_item.weight方法,而weight方法已经测试过了
为了减少麻烦,我们可以使用mock方式来简化测试而不需要fixtures

我们需要先安装mocha
sudo gem install mocha

然后在test_helper.rb里require mocha:
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'
require 'mocha'

我们这样使用mocha来写CartTest:
require File.dirname(__FILE__) + '/../test_helper'

class CartTest < Test::Unit::TestCase
  def test_total_weight_should_be_sum_of_line_item_weights
    cart = Cart.new
    cart.line_items.build.stubs(:weight).returns(7)
    cart.line_items.build.stubs(:weight).returns(3)
    assert_equal 10, cart.total_weight
  end
end

由于前面已经测过了weight方法,这里使用stubs模拟weight方法的返回值,将测试逻辑专注于total_weight方法
分享到:
评论
2 楼 hideto 2007-12-21  
1 楼 张云洁 2007-12-17  
恩,很好,能不能多写一些关于模型和功能测试的,我是初学者,多测试先多了解一些!

相关推荐

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...

    java基础之rails命令大全.pdf

    ### Java基础之Rails命令大全知识点解析 #### 一、Rails 命令概述 Rails 是一个用于 Web 开发的框架,它基于 Ruby 语言。Rails 遵循 MVC(Model-View-Controller)架构模式,使得 Web 应用程序的开发更加高效、简洁...

    深入解析Rails测试策略:单元测试与功能测试的区别

    在软件开发中,测试是确保...通过本文的探讨,我们了解到了Rails中单元测试和功能测试的区别,以及如何利用Rails的测试工具来编写高质量的测试代码。掌握这些知识,将有助于开发者在Rails项目中实施有效的测试策略。

    使用RSpec 测试Rails 程序.pdf

    ### 使用RSpec 测试Rails 程序的知识点总结 #### 一、RSpec与Rails结合的基础概念 **RSpec**(RSpec is not a unit testing framework)是一种为Ruby编程语言设计的行为驱动开发(BDD)框架,而**Rails**是基于...

    Ruby on Rails入门经典代码

    - Rails Console:交互式的命令行环境,用于调试和测试代码。 - Rails Server:启动本地开发服务器。 7. **Rails最佳实践**: - RESTful设计:遵循HTTP动词(GET, POST, PUT, DELETE)来设计API。 - Convention...

    Ruby-on-Rails-3.rar_site:www.pudn.com

    该资源的核心内容是《Web开发敏捷之道 - 应用Rails进行敏捷Web开发 - 第三版》这本书的PDF版本。这本书详细介绍了使用Ruby on Rails框架进行敏捷Web开发的相关知识。 Ruby on Rails(简称Rails)是一种基于Ruby编程...

    Ruby on Rails:Rails中的测试驱动开发.docx

    Ruby on Rails:Rails中的测试驱动开发.docx

    Ruby on Rails入门例子

    Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...

    搭建Rails测试环境2: Autotest和Spork的安装和配置

    在Ruby on Rails开发中,测试是确保代码质量与应用程序稳定性的重要环节。Rails提供了多种测试工具,Autotest和Spork就是其中两个常见的辅助测试工具。本文将详细介绍如何在Rails环境中安装和配置这两个工具。 首先...

    Rails相关电子书汇总

    11. **Rails Console**:提供了一个交互式的Ruby环境,便于开发者调试和实验代码。 12. **Rails API模式**:Rails 4引入了API模式,使得构建RESTful JSON接口变得更加简单。 13. **Webpacker和Webpack**:Rails ...

    Advanced Rails

    了解如何编写单元测试、集成测试和功能测试,以及如何设置持续集成服务如Jenkins或CircleCI,是高级Rails开发者必备技能。 5. **Rails安全**:学习如何防止常见的Web攻击,如SQL注入、跨站脚本(XSS)和跨站请求...

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成.zip

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...

    [Rails] Crafting Rails Applications (英文版)

    [Pragmatic Bookshelf] Crafting Rails Applications Expert Practices for Everyday Rails Development (E-Book) ☆ 图书概要:☆ Rails 3 is a huge step forward. You can now easily extend the framework, ...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    #### 六、添加第二个路由 - **配置**:在`config/routes.rb`文件中添加新的路由规则,例如`get 'new_route' =&gt; 'controller#action'`。 - **效果**:这将在应用中增加一个新的URL路径,指向指定控制器的动作。 ###...

    rails指南 中文版

    7. **Testing**:Rails强调测试驱动开发,内置了RSpec、Minitest等测试框架,支持单元测试、集成测试和功能测试,确保代码质量。 8. **Asset Pipeline**:Rails的资产管道处理JavaScript、CSS和图像等静态资源,...

    Rails 101 入门电子书

    - 学习如何创建第一个Rails应用程序。 - **过程**: - 创建新项目。 - 设置数据库配置。 - 创建控制器和视图。 - 在浏览器中查看结果。 #### 六、Rails的路由 - **概念介绍**: 路由是连接用户请求URL与应用...

    ruby命令集合(一些有用的命令)

    - `rake db:fixtures:load`: 加载fixtures数据到数据库。可以通过`FIXTURES=x,y`来指定加载哪些fixtures。 - `rake db:migrate`: 执行数据库迁移。可以使用`VERSION=x`来指定执行到哪个版本。 - `rake db:schema:...

    Rails 101S

    ### Rails 101S: 初学者必备的Ruby on Rails 宝典 #### Introduction: 深入了解Ruby on Rails 《Rails 101S》是一本为Ruby on Rails初学者准备的手册,旨在帮助新手快速入门并掌握基本的开发技能。本手册将从最...

Global site tag (gtag.js) - Google Analytics