【问题标题】:Testing a patch to the Rails mysql adapter测试 Rails mysql 适配器的补丁
【发布时间】:2010-03-09 09:06:39
【问题描述】:

我为 Rails MySQLAdapter 编写了一个小猴子补丁,并希望将其打包以在我的其他项目中使用。我正在尝试为它编写一些测试,但我仍然是测试新手,我不知道如何测试它。有人可以帮我入门吗?

这是我要测试的代码:

unless RAILS_ENV == 'production'
      module ActiveRecord
        module ConnectionAdapters
          class MysqlAdapter < AbstractAdapter
            def select_with_explain(sql, name = nil)
              explanation = execute_with_disable_logging('EXPLAIN ' + sql)
              e = explanation.all_hashes.first
              exp = e.collect{|k,v| " | #{k}: #{v} "}.join
              log(exp, 'Explain')
              select_without_explain(sql, name)
            end

            def execute_with_disable_logging(sql, name = nil) #:nodoc:
              #Run a query without logging
              @connection.query(sql)
            rescue ActiveRecord::StatementInvalid => exception
              if exception.message.split(":").first =~ /Packets out of order/
                raise ActiveRecord::StatementInvalid, "'Packets out of order' error was received from the database. Please update your mysql bindings (gem install mysql) and read http://dev.mysql.com/doc/mysql/en/password-hashing.html for more information.  If you're on Windows, use the Instant Rails installer to get the updated mysql bindings."
              else
                raise
              end
            end
            alias_method_chain :select, :explain
          end
        end
      end
    end

谢谢。

【问题讨论】:

    标签: ruby-on-rails unit-testing ruby-on-rails-plugins


    【解决方案1】:

    一般测试

    你可以开始阅读testing

    在您了解了测试的基础知识之后,您应该考虑一下您所做的更改。然后做一些测试来测试

    • 原来的情况,更新后出现错误。因此,在它确实适用于原始情况之后,反转测试。
    • 新情况,看看你是否正确实现了你的想法

    最难的部分是确保您涵盖所有情况。最后,如果两个部分都通过了,那么您可以说您的代码按预期工作。

    测试宝石

    为了测试 gem,你可以运行

    rake test:plugins
    

    要测试您的 rails 应用程序的所有插件(请参阅testing guide 的第 6 章中的更多内容),这仅在 gem 位于应用程序的 vendor 目录中时才有效。

    另一种可能性是通过包含测试任务来修改 gem 的 Rakefile。比如这个

    desc 'Test my custom made gem.'
    Rake::TestTask.new(:test) do |t|
      t.libs << 'lib'
      t.libs << 'test'
      t.pattern = 'test/**/*_test.rb'
      t.verbose = true
    end
    

    将运行以_test.rb 结尾的test 目录中的所有可用测试。要执行此测试,您可以输入 rake test(来自 gem 目录!)。

    为了默认运行 gem 的测试(当只输入 rake 时),您可以添加/修改这一行:

    task :default => :test
    

    我在ruby-bbcode gem 中使用了第二种方法,因此您可以查看它以查看完整示例。

    【讨论】:

    • 我肯定一直在阅读有关测试的内容。我现在已经习惯了它的基础知识。我只是有点不确定如何处理这个问题,因为它特定于 mysql 适配器,我需要拉入 ActiveRecord,然后在测试中应用我的补丁,然后调用 reponds_to?或者看看它是否对我添加的方法有反应?我在这里吗?
    • 我看不懂你的代码,不知道你想实现什么。但它会改变 mysql 适配器的行为,因此只需检查这种行为变化是否符合您的预期行为。在您的情况下,您可能确实应该获取一些 ActiveRecords 以查看 mysql 适配器是否正常工作。如果动态应用补丁太难(取决于您的测试),您可以跳过测试原始情况的结果。
    • 代码只是在运行每个 select 之前运行 MySQL EXPLAIN 语句。它只是为了帮助提醒我添加索引。我发现测试令人困惑,因为我想将它与 Rails 应用程序分开打包。我希望它成为一个宝石,这样我就可以将它与我的其他项目一起使用。那么,当周围没有 Rails 应用程序时,如何测试对 mysql 连接的更改?它从哪里获得连接凭据?可以单独测试这种东西吗?
    • 哦...我不明白你想测试宝石,我在回答中添加了一些解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多