`
open2ye
  • 浏览: 101012 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

rails 的测试的 bug 当你的 model 的 after_create 中有raise 时

阅读更多
app/models/part.rb

class Part < ActiveRecord::Base
  def after_create
    raise "no way" if self.name == "test"
  end
end


app/controllers/parts_controller.rb

class PartsController < ApplicationController
  def test
    Part.create!(:name => "test")
  end
end


test/functional/parts_controller_test.rb

require File.dirname(__FILE__) + '/../test_helper'

class PartsControllerTest < ActionController::TestCase
  def test_test
    old_count = Part.count
    post :test rescue nil   
    assert_equal(old_count, Part.count)
  end
end


    ruby test\functional\parts_controller_test.rb


结果是

<2> expected but was
<3>.


日志是
Processing PartsController#test (for 0.0.0.0 at 2008-05-01 16:26:57) [POST]
  Session ID: 
  Parameters: {"action"=>"test", "controller"=>"parts"}
  Part Create (0.000000)   INSERT INTO parts ("name", "updated_at", "created_at") VALUES('test', '2008-05-01 16:26:57', '2008-05-01 16:26:57')
  SQL (0.000000)   SELECT count(*) AS count_all FROM parts 

看到没. 居然没有 回滚

换用集成测试
test/integration/model_hg_test.rb
require "#{File.dirname(__FILE__)}/../test_helper"

class ModelHgTest < ActionController::IntegrationTest
  fixtures :parts

  def test_truth
    old_count = Part.count
    
    puts Part.find_by_sql("select * from parts").collect(&:id).join(", ")
    puts Part.find_by_sql("select * from parts").collect(&:name).join(", ")
    
    post '/parts/test'
    
    puts Part.find_by_sql("select * from parts").collect(&:id).join(", ")
    puts Part.find_by_sql("select * from parts").collect(&:name).join(", ")
    
    assert_equal(old_count, Part.count)
    
  end
end


结果是


D:\t1\t1>ruby test\integration\model_hg_test.rb
Loaded suite test/integration/model_hg_test
Started
953125641, 996332877
MyString, MyString
953125641, 996332877, 996332878
MyString, MyString, test
F
Finished in 1.281 seconds.

  1) Failure:
test_truth(ModelHgTest)
    [test/integration/model_hg_test.rb:17:in `test_truth'
     E:/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/integration.rb:547:in `
']:
<2> expected but was
<3>.

1 tests, 1 assertions, 1 failures, 0 errors


没有 回滚

狂汗!!!
分享到:
评论
7 楼 iamawalrus 2008-05-05  
还有一个可能造成这个问题的原因是rails test的transactional fixture功能.

缺省是打开的,会造成transaction的嵌套,导致rollback延迟, 在test method中不能执行.

你可以试试在test_helper中把它关掉:
  self.use_transactional_fixtures = false


需要注意,改变这个选项可能会影响一些依赖这个功能的测试.
6 楼 open2ye 2008-05-02  
gigix 写道

干嘛不放在before_save呢?


例如Part
在 before_save 前会有很多的验证. 都可以导致创建失败.

这个场景正好要做,创建成功后记录创建日志的问题

所以用 after_save 在我的场景内更合适.


撇开 用 after_save 还是 before_save 或是  xx_validation 等等.
为什么, Rails 的测试环境 要不回滚呢?
是BUG 还是故意为之,  待有空时看看源码才行啦
5 楼 open2ye 2008-05-02  
iamawalrus 写道

检查test环境的db以及对应的table是否和dev/production下一致.比如,store engine是否一致.
举个例子,如果dev和production用的是mysql,table是innodb,而test用了myisam,就有可能出现你这样的问题.
最好给出你的环境配置,不然大家只能猜.


默认配置

# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  database: db/development.sqlite3
  timeout: 5000

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  timeout: 5000


4 楼 iamawalrus 2008-05-02  
open2ye 写道
这个需求很普遍

比如一个是零件表, 另一个是零件的创建日志表

比如  修改记录 等等..

写到 after_create 比用事务代码看起来要好看和自然很多.

另外. 奇怪的是, 在 development 和 production 下, 都有回滚

只有 test 下没有回滚,  这个看似 Rails 测试的 BUG

我在官方论坛搜索一下, 没有搜到

检查test环境的db以及对应的table是否和dev/production下一致.比如,store engine是否一致.
举个例子,如果dev和production用的是mysql,table是innodb,而test用了myisam,就有可能出现你这样的问题.
最好给出你的环境配置,不然大家只能猜.
3 楼 gigix 2008-05-02  
open2ye 写道
这个需求很普遍

比如一个是零件表, 另一个是零件的创建日志表

比如  修改记录 等等..

写到 after_create 比用事务代码看起来要好看和自然很多.

另外. 奇怪的是, 在 development 和 production 下, 都有回滚

只有 test 下没有回滚,  这个看似 Rails 测试的 BUG

我在官方论坛搜索一下, 没有搜到

干嘛不放在before_save呢?
2 楼 open2ye 2008-05-02  
这个需求很普遍

比如一个是零件表, 另一个是零件的创建日志表

比如  修改记录 等等..

写到 after_create 比用事务代码看起来要好看和自然很多.

另外. 奇怪的是, 在 development 和 production 下, 都有回滚

只有 test 下没有回滚,  这个看似 Rails 测试的 BUG

我在官方论坛搜索一下, 没有搜到
1 楼 lgn21st 2008-05-01  
如果在create后raise异常回滚,会让我无法理解
检查数据最好的时机应该是
# (1) before_validation
# (2) before_validation_on_create
# (-) validate
# (-) validate_on_create

相关推荐

    rails_model_test_hello_world

    自述文件版本和设置$ ruby -vruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]$ rails -... $ rails new rails_model_test_hello_world -T -m ~/rtfb_template.rb$ cd rails_model_test_hello_world$ rail

    RestFul_Rails_Dev_pdf_v_0.1.zip

    本资料“RestFul_Rails_Dev_pdf_v_0.1.zip”包含了《RESTful Rails Development》的翻译版,将深入探讨如何在Rails中实现RESTful的设计模式。 首先,RESTful设计的核心概念是资源(Resources)。在Rails中,资源...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    Rails_Recipes_with_Source_Code

    5. **测试(Testing)**:Rails强调TDD(Test Driven Development)和BDD(Behavior Driven Development),书中可能介绍Rspec、Capybara等测试工具的使用,包括单元测试、集成测试和功能测试。 6. **数据库迁移...

    用于过滤英文脏话的 Rails 插件 gem_Ruby_代码_相关文件_下载

    在Ruby on Rails开发中,有时候我们需要对用户输入的数据进行过滤,特别是处理英文内容时,防止出现不合适的脏话或亵渎性词汇。标题提到的"用于过滤英文脏话的 Rails 插件 gem"正是为了解决这个问题。这个插件允许...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **升级**:当需要更新到Rails的最新版本时,可以使用`bundle update rails`命令来更新依赖。 - **回滚**:如果更新后出现问题,可以通过`git`命令或者手动修改`Gemfile`来回滚到之前的版本。 #### 六、添加第二个...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    RSepc rails 测试框架介绍

    创建测试代码时,当使用 Rails 的 `scaffold` 生成器时,RSpec 会自动生成相应的测试代码到 `spec` 目录下。如果需要为视图、助手等创建测试,可以直接在相应目录下创建 `.spec.rb` 文件。 执行测试用例,只需要在...

    Ruby-on-Rails-rails.zip

    Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_...

    Rails里给文件上传添加progress_bar

    在Ruby on Rails(Rails)框架中,为文件上传添加进度条功能可以显著提升用户体验,让用户在上传大文件时能够实时了解进度,增加交互性。在本文中,我们将深入探讨如何在Rails应用中实现这一功能。 首先,我们需要...

    inspinia admin - v2.5 Rails_Full_Version

    当你解压"Rails_Full_Version"并开始开发时,可以参考这些知识点逐步构建和定制你的后台管理系统。务必保持代码整洁,遵循DRY(Don't Repeat Yourself)原则,以实现高效且可扩展的代码。同时,不断学习和研究新的...

    agile_web_development_with_rails_3rd_edition.9994652073.pdf

    书中强调了版本控制的重要性,特别是在使用Rails这样的活跃开源项目时。由于Rails不断更新,新功能的引入或API的修改都可能导致代码兼容性问题。为了确保代码的正确运行,作者建议在使用本书示例代码之前,先检查...

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

    在软件开发中,测试是确保代码质量和功能正确性的关键环节。Ruby on Rails作为一个全栈服务器端框架,提供了一套强大的测试工具和约定,以支持不同...掌握这些知识,将有助于开发者在Rails项目中实施有效的测试策略。

    使用RSpec 测试Rails 程序.pdf

    - **涉及JavaScript的交互**:当应用中有复杂的JavaScript交互时,编写功能测试变得尤为重要,可以确保这些交互按预期工作。 #### 七、提升测试速度 - **可选的简练句法**:了解如何使用RSpec提供的简练句法来提高...

    InspiniaAdmin 2.6.1 Rails_Full_Version

    在Rails_Full_Version压缩包中,包含了完整的源代码和必要的资源文件,开发者可以通过解压并导入到Rails项目中,按照官方文档进行配置和定制。同时,这个版本可能还包含了升级记录、更改日志和可能的bug修复,以保证...

    rails_get_to_the_fest

    标题 "rails_get_to_the_fest" 暗示着这是一个关于Ruby on Rails的项目,可能是为某种节日或活动创建的Web应用。Rails是基于Ruby语言的开源Web开发框架,它遵循MVC(模型-视图-控制器)架构模式,使得构建数据库驱动...

    rails上传文件_paperclip

    path: ':rails_root/public/system/:class/:attachment/:id_partition/:style/:filename', url: '/system/:class/:attachment/:id_partition/:style/:filename' } ``` 2. **模型设置** 在你想要处理文件上传的...

    rails_with_webpack_starter_kit:带有Webpack项目入门工具包的Personal Rails

    创建新项目时通常使用的宝石和配置样板。 最新的Rails版本。 PostgreSQL Webpack作为资产构建器 React Redux … 安装说明 $ git clone git@github.com:bigardone/rails_with_webpack_starter_kit.git $ bundle ...

    03-2 . 安装不同版本的Rails与产生Rails 5.x版专案

    [Ruby_on_Rails][中文][Rails_5.x]__03-2_._安裝不同版本的Rails與產生Rails_5.x版

Global site tag (gtag.js) - Google Analytics