从旧源测试宝石

时间:2014-11-20 10:00:24

标签: ruby-on-rails ruby sqlite testing gem

我目前正在尝试将一个非常古老的Rails 1.x插件转换为兼容Rails4的Gem。 我设法重写代码并使框架启动并运行,但测试当前失败并出现以下错误:

  

ActiveRecord :: RecordNotFound:无法找到所有包含' id'的页面:   (首先,{:conditions => [" url_slug =?和parent_id IS NULL",   "原始页面"]})(找到0结果,但正在寻找2)

我接受了相当多的工作,但抛出错误的代码位于此处:

acts_as_slugable_class.transaction do
   while existing != nil
       existing = acts_as_slugable_class.find(:first, conditions: ["#{slug_column} = ? and #{slug_scope_condition}", proposed_slug + suffix])
       if existing
          if suffix.empty?
             suffix = "-0"
          else
             suffix.succ!
          end
        end
    end
end

我使用ActiveRecord / Support的TestCase进行基本设置运行测试,并使用Sqlite运行内存数据库。 Database.yml文件:

test:
  adapter: sqlite3
  database: ":memory:"

当我在现有语句的末尾添加 rescue nil 时,除了唯一性检查外,所有测试都会通过。 这就是我的test_helper.rb文件:

# Configure Rails Environment
$:.unshift(File.dirname(__FILE__) + '/../lib')
ENV['RAILS_ENV'] = 'test'
require 'rails'
require 'rails/test_help'
require 'active_record'
require 'active_support'
require 'yaml'
require 'acts_as_slugable'

Rails.backtrace_cleaner.remove_silencers!

# Load support files
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }

# Load fixtures from the engine
if ActiveSupport::TestCase.method_defined?(:fixture_path=)
  ActiveSupport::TestCase.fixture_path = File.expand_path('../fixtures', __FILE__)
end

# run the database migrations
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))

ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
ActiveRecord::Base.establish_connection(config[ENV['RAILS_ENV']])
load(File.dirname(__FILE__) + '/schema.rb')

这有点像黑客攻击,但我也将源代码上传到了我的github。 如果有人想修补它并帮助我解决为什么没有任何东西进入数据库:

https://github.com/NekoNova/acts_as_slugable

1 个答案:

答案 0 :(得分:2)

如果我们试图让Rails4准备就绪,为什么会有旧的查找语法?

acts_as_slugable_class.transaction do
   while existing != nil
       existing = acts_as_slugable_class.where(["#{slug_column} = ? and #{slug_scope_condition}", proposed_slug + suffix]).first
       if existing
          if suffix.empty?
             suffix = "-0"
          else
             suffix.succ!
          end
        end
    end
end

如果找不到对象,这也应该正确返回nil(与find相比,如果找不到某个东西会引发错误。)