`
cookoo
  • 浏览: 647300 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

rake test:units在SQL和Ruby DSL两种schema模式下的差异

    博客分类:
  • Ruby
阅读更多
sql方式,会复制development数据库中的外键。相反,在schema模式下的外键是被完全忽略的,即使开发数据库里有,也不会复制到test数据库里。

而test:units执行的时候是根据environment.rb里的config.active_record.schema_format = sql设置(注释掉时为ruby dsl模式)来判断用哪种模式的。通过使用rake test:units --trace我们可以看见两者的差别:(忽略invoke,只看execute)

ruby dsl模式的schema下执行的task:
** Invoke test:units (first_time)     
** Invoke db:test:prepare (first_time)
** Invoke environment (first_time)    
** Execute environment                
** Execute db:test:prepare            
** Invoke db:test:clone (first_time)  
** Invoke db:schema:dump (first_time) 
** Invoke environment                 
** Execute db:schema:dump             
** Execute db:test:clone              
** Invoke db:schema:load (first_time) 
** Invoke environment                 
** Execute db:schema:load             
** Execute test:units               
...

sql模式的schema下执行的task: 
** Invoke test:units (first_time)            
** Invoke db:test:prepare (first_time)       
** Invoke environment (first_time)           
** Execute environment                       
** Execute db:test:prepare                   
** Invoke db:test:clone_structure (first_time)
** Invoke db:structure:dump (first_time)     
** Invoke environment                        
** Execute db:structure:dump                 
** Invoke db:test:purge (first_time)         
** Invoke environment                        
** Execute db:test:purge                     
** Execute db:test:clone_structure           
** Execute test:units                        

具体的task内部代码就不展开讨论了,关键差别是sql模式知道有外键存在,所以多了一个db:test:purge直接删整个数据库而不管表顺序一一删除的操作。而schema模式假设没有外键,只是简单用load。load这个操作就是删一个再建一个的,这某种程度上是ruby dsl风格的schema的限制所致(必须顺序执行,不能事先检查外键依赖关系)。

所以解决办法就是:先purge掉test数据库,然后设好config.active_record.schema_format要外键的用sql格式,不要外键用ruby dsl格式(但是has_many之类关联设置后面最好设一下:dependent参数)。然后直接用test:units,不用事先自己建立test表结构。
分享到:
评论

相关推荐

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

    - `rake test:units`: 运行单元测试。 - **临时文件管理** - `rake tmp:cache:clear`: 清除`tmp/cache`目录下的文件。 - `rake tmp:clear`: 清除`tmp/sessions`和`tmp/cache`目录下的文件。 以上这些命令是...

    java基础之rails命令大全.pdf

    - `rake db:test:prepare`: 准备测试数据库并加载 schema。 - `rake db:test:clone`: 从当前环境的数据库克隆测试数据库。 - `rake db:test:clone_structure`: 仅复制数据库结构至测试环境。 - `rake db:test:...

    rake-completion:对Rake的Bash补全支持

    $ rake st<Tab> $ rake stats $ rake test<Tab><Tab> test test:integration test:recent test:benchmark test:plugins test:uncommitted test:functionals test:profile test:units它将任务缓存到.rake_tasks~文件...

    rake-0.8.7

    在Ruby on Rails框架中,`rake`是一个不可或缺的工具,它扮演着构建、部署和管理任务的角色。Rake,全称为“Ruby Make”,是Ruby语言的一个构建系统,灵感来源于Perl的Make工具和Ant。在Rails应用中,`rake`不仅用于...

    raygun4ruby:Raygun的Ruby和Ruby on Rails提供程序

    雷根4Ruby 这是Raygun错误报告程序的Ruby适配器。安装将此行添加到您的应用...您可以运行以下命令测试Raygun集成: rake raygun:test您应该在Raygun仪表板中看到一个“ ItWorksException”。 您已经准备好解决这些错

    redmine_password_tool:Redmine 密码管理插件

    每个项目的基于角色的访问 测试 概括 在 travis-ci.org(主分支)上 测试政策 一切都应该被测试覆盖 ...rake db:drop db:create db:migrate db:test:load db:test:prepare redmine:plugins:migrate redmine:load

    Ruby中任务构建工具rake的入门学习教程

    在Ruby编程语言中,Rake是一个非常重要的工具,它被称为Ruby Make,因为它提供了一种类似于Makefile的功能,但使用Ruby语法。Rake不仅用于构建代码,更常被用来作为任务管理器,帮助开发者组织和执行一系列自动化...

    ridgepole-rails:在RoR上使用ridgepole的便捷任务

    Ridgepole-rails提供了两个Rake任务: ridgepole:export和ridgepole:apply它们分别包装的ridgepole --export和ridgepole --apply 。 用法 要将数据库的当前架构导出到Schemafile rake ridgepole:export 将Schema...

    gofl:玩康威的人生游戏

    运行测试运行rake运行所有ruby和javascript测试。 通常,我试图将尽可能多的测试与数据库和Rails分离开来。 您只能使用rake test:fast运行这些规范。 运行rake test:js自己在控制台中仅运行javascript规范。 如果要...

    rake详解(清晰)

    除了在`Rakefile`中直接定义任务,还可以通过`Rake::Task`对象进行更复杂的操作,如修改已定义的任务,或者在运行时动态创建任务。 总结,Rake作为Ruby的构建工具,提供了强大的任务管理和执行能力,通过`Rakefile`...

    inject-some-sql:将SQL注入Ruby on Rails应用程序中很有趣!

    注入一些SQL 这些是示例Rails应用程序,用于演示可以在Rails中注入SQL的多种方式。建立克隆仓库: git clone https://github.com/presidentbeef/inject-some-sql.git选择Rails 5,Rails 4或Rails3。它们每个都有自己...

    rake:Ruby的make-make构建工具

    **rake:Ruby的构建神器** 在Ruby世界中,`rake`是一个强大的构建工具,类似于C语言中的`make`。它允许开发者定义任务,并通过简单的命令行接口执行这些任务,极大地提高了开发效率。`rake`是Ruby社区广泛接受的...

    ruby初始使用过程总结

    通过ActiveRecord,你可以创建数据库模式(schema),定义模型(model)和迁移(migration)。例如,创建一个新的数据库可以写一个创建迁移的脚本,如: ```ruby rails generate migration CreateUsers name:string...

    ruby example webrick

    ruby sample: @echo off cd D:\proj\demo rem previously drop tables call rake db:migrate VERSION=0 rem load test data (it depends on the db:environment and db:migrate tasks) call rake db:load_test_...

    rake-compiler:提供一种标准且简化的方法,以Rake作为胶水来构建和打包Ruby C和Java扩展

    rake-compiler是处理数种不同的RubyGems的来之不易的经验的结果,这些RubyGems以不同的方式为不同的平台和不同的用户配置提供了本机扩展。 诸如代码可移植性的差异,代码清晰度的差异以及项目目录结构的差异之类的...

    rubygems-tasks:用于管理和发布Ruby项目的简单Rake任务

    项目生成器与用于构建,安装和发布Ruby项目的Rake任务无关。 最近,许多Ruby开发人员开始手动创建Ruby项目,并使用gem build / gem push来构建/发布RubyGems。 有时,这导致RubyGems的发布带有未提交的更改,或者...

    recipes:使用Ruby和PostgreSQL添加食谱的数字食谱

    食谱盒 Epicodus的Ruby / ActiveRecord练习,2015年8月27日 珍妮丝·邓恩(Janice Dunn)...'rake db:test:prepare'创建测试数据库 'psql'打开postgres ruby app.rb启动sinatra服务器 在您的Web浏览器中导航到localh

    ruby学习的源码

    - Rake:Ruby的Make工具,用于执行脚本任务,如数据库迁移、测试等。 - Rails Console:交互式命令行工具,方便开发者在运行时检查和修改应用程序状态。 4. **Rails开发流程**: - 新建项目:使用`rails new`...

    migration:来自卢甘斯克、顿涅茨克地区、克里米亚自治共和国和塞瓦斯托波尔的移民登记册

    安装:git pull RAILS_ENV=test rake db:migrate RAILS_ENV=test rake db:seed RAILS_ENV=test rake vacancy:seed RAILS_ENV=test rake koatuu:seed RAILS_ENV=测试包 RAILS_ENV=测试 rake 资产:预编译 RAILS_ENV...

Global site tag (gtag.js) - Google Analytics