`
thundercao
  • 浏览: 13935 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Rails单元测试的一点点疑惑

阅读更多
今天在做单元测试时发现一个小问题,就是如果运行多个测试类,会因为外键问题无法删除测试数据导致测试失败.如下:

测试类一
ruby 代码
 
  1. require File.dirname(__FILE__) + '/../test_helper'  
  2.   
  3. class ShareTest < Test::Unit::TestCase  
  4.   self.use_transactional_fixtures = true  
  5.   fixtures :users,:share_catagories,:shares  
  6.   # Replace this with your real tests.  
  7.   def test_last_shares  
  8.     assert_not_nil Share.last_shares(5)  
  9.   end  
  10.     
  11. end  

测试类二
ruby 代码
 
  1. require File.dirname(__FILE__) + '/../test_helper'  
  2.   
  3. class BlogTest < Test::Unit::TestCase  
  4.   self.use_transactional_fixtures = true  
  5.   fixtures :users,:blogs,:blog_members  
  6.      
  7.   def test_hearty_seniority  
  8.     assert_not_nil Blog.hearty_seniority(2)  
  9.   end  
  10.   
  11. end  

表间关系:
   user 与 blog 是一对一,blog与 blog_members是一对多,share_catagoriesshares也是一对多,user与shares也是一对多
问题症状:
   如果先运行ShareTest,测试通过.再运行BlogTest时夹具在测试方法运行前初始化数据,实际上是删除表再建表的一个过程,但因为前面运行过ShareTest了,此时在对user表初始时就会发生有外键引用(shares),无法初始化(fixtures),导致测试失败.
解决方法:
   将表间的外键关系删除.

这个问题到也不是什么大问题,后来看了一下typo的建表脚本,确实是没有外键,但有点想不明白,难道在设计数据库时不需要用到外键?还是说在测试时将外键删除掉,正式发布时还在用带有外键的脚本建表.typo已经是一个可以放在生产环境下使用的系统了,它就不需要外键,全部通过程序控制?或者说在Model里定义表关联时用dependent参数来保证外键?

我个人也不喜欢使用各种数据库自有的特性,但外键却是大多数数据库支持的东西,如果仅是因为测试而去除这个强大的功能,好像有点........
分享到:
评论
4 楼 thundercao 2007-09-07  
试试看
3 楼 Readonly 2007-09-07  
check out
http://dev.rubyonrails.org/ticket/2404

一个已经存在了2年的争论,rails team的人一直以为了保障unit test速度为理由,不肯打这个patch,简直是OOXX...

这个问题还不单单是外键问题,在一些牵涉到统计的测试用例里面,也会有前一个unit test fixuture没有清理干净,导致断言出错的情况。

偶建议用讨论里面有个rick发的patch,很简洁地解决了这个问题。
2 楼 dogstar 2007-09-07  
外键的作用无外乎是保证数据完备,这些可以用程序做到。而且,使用数据库这些特性的话也有很大的开销,不完备检查呀之类的。就我目前的经验来看,没有必要使用外键。至少我到现在从来没有用过。
1 楼 pig345 2007-09-07  
似乎Rails有意在回避这个问题。
他都没有内置对外键的自动支持。

相关推荐

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

    单元测试和功能测试是Rails中两种主要的测试类型,它们在目的、范围和实现方式上有所不同。本文将详细探讨Rails中单元测试和功能测试的区别,并提供实际代码示例。 单元测试和功能测试是Rails测试策略的两个重要组成...

    使用RSpec 测试Rails 程序.pdf

    将RSpec与Rails相结合可以有效地进行单元测试、集成测试以及端到端测试,从而确保应用程序的质量。 ##### 为什么使用RSpec? - **可读性高**:RSpec提供了清晰易懂的DSL(领域特定语言),使得测试代码更容易理解...

    combustion, 简单,优雅的Rails 引擎测试.zip

    combustion, 简单,优雅的Rails 引擎测试 燃烧in是一个以简单有效的方式测试 Rails 引擎的库,而不是在规范或者测试文件夹中创建完整的Rails 应用。它允许你在引擎的上下文中编写你的规格,只使用你需要的Rails 应用...

    Ruby-APITaster一种快速而简单的方法来可视化测试你的Rails应用API

    Ruby-APITaster是一款强大的工具,专为Rails应用的API测试和可视化设计。它使得开发者能够迅速地对API接口进行互动式测试,从而确保API的功能正确性和性能稳定性。这款工具的出现,极大地简化了API测试过程,提高了...

    RSepc rails 测试框架介绍

    RSepc 是一款基于 Ruby 的行为驱动开发(BDD)测试框架,它被广泛应用于 Rails 应用程序的测试。RSpec 提供了一种清晰且简洁的方式来编写可读性强的测试代码,使得测试用例更像是对软件行为的规范描述,而不是简单的...

    rails指南 中文版

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

    rails2-sample

    这一章节将教授如何使用Rails的测试框架进行单元测试、集成测试和功能测试。同时,也会介绍如何对应用进行基准测试,评估其性能表现。 #### 12. Deployment and Production Use(部署和生产使用) 最后,本书将...

    Rails项目源代码

    Rails鼓励TDD(测试驱动开发),包括单元测试、集成测试和功能测试。RSpec、Capybara等库可以帮助编写和运行这些测试,确保代码质量。 这个Rails项目提供了学习和研究Web开发的机会,特别是对于Ruby on Rails新手...

    Rails 4 Test Prescriptions

    通过深入分析不同测试方法(如单元测试、集成测试等)之间的优缺点,帮助读者理解何时以及为何应选择特定类型的测试。 2. **Mocking与Stubbing详解**:对于新接触测试驱动开发(TDD)的开发者来说,本书对Mocking和...

    Rails入门教程一(翻译).pdf

    在开发过程中,Rails还提供了TDD(测试驱动开发)的支持,其内建的测试框架Rspec和MiniTest允许开发者编写单元测试、集成测试和功能测试,确保代码的质量和稳定性。 总之,Rails入门教程一将涵盖Rails的基础知识,...

    Rails 101 入门电子书

    - 测试安装: 创建一个简单的Rails应用来验证是否成功安装。 #### 五、练习作业0-Hello World - **目标**: - 学习如何创建第一个Rails应用程序。 - **过程**: - 创建新项目。 - 设置数据库配置。 - 创建控制器...

    关于rails 3.1 cucumber-rails 1.2.0

    通过这种方式,Cucumber-Rails帮助团队确保代码按照预期运行,同时提供了一种非技术人员也能理解的测试文档。 在`support`目录下,开发者可以放置一些辅助文件,例如World类(用于扩展Cucumber的上下文)、Hooks...

    Ruby on Rails Guides_ A Guide to Testing Rails Applications.pdf

    《Ruby on Rails应用程序测试指南》深入解读 一、为何为Rails应用编写测试?...从理论到实践,从单元测试到集成测试,这份指南都提供了详尽的指导,是任何希望提升Rails应用稳定性和可维护性的开发者不可或缺的参考。

    Rails 4 Test Prescriptions.pdf

    - **模拟(Mocking)**:模拟是一种技术,用于模拟对象的行为,特别是在单元测试中用来替代外部依赖项。它可以帮助开发者更准确地测试单个组件的功能,而不会受到其他部分的影响。 - **存根(Stubbing)**:存根则是替换...

    railsAPI

    Rails集成了测试框架如RSpec和MiniTest,允许开发者编写单元测试、集成测试和功能测试,确保代码的稳定性和可靠性。 安全方面,Rails提供了许多安全特性,如CSRF(跨站请求伪造)防护、XSS(跨站脚本)防御、以及...

Global site tag (gtag.js) - Google Analytics