Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 测试Rails mysql适配器的补丁_Ruby On Rails_Unit Testing_Ruby On Rails Plugins - Fatal编程技术网

Ruby on rails 测试Rails mysql适配器的补丁

Ruby on rails 测试Rails mysql适配器的补丁,ruby-on-rails,unit-testing,ruby-on-rails-plugins,Ruby On Rails,Unit Testing,Ruby On Rails Plugins,我为Rails MySQLAdapter编写了一个小monkeypatch,并希望将其打包,以便在我的其他项目中使用。我正在尝试为它编写一些测试,但我对测试还是新手,我不知道如何测试它。有人能帮我开始吗 下面是我要测试的代码: unless RAILS_ENV == 'production' module ActiveRecord module ConnectionAdapters class MysqlAdapter < AbstractA

我为Rails MySQLAdapter编写了一个小monkeypatch,并希望将其打包,以便在我的其他项目中使用。我正在尝试为它编写一些测试,但我对测试还是新手,我不知道如何测试它。有人能帮我开始吗

下面是我要测试的代码:

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
谢谢。

常规测试 你可以开始读关于

在您理解了测试的基本知识之后,您应该思考您已经改变了什么。然后做一些测试,测试

原始情况,导致更新后出现错误。因此,在测试确实对原始情况起作用之后,将其反转。 看看你是否正确地实施了你的想法 最困难的部分是确保你涵盖了所有情况。最后,如果两个部分都通过了,那么您可以说您的代码按预期工作

测试宝石 为了测试gems,您可以运行

rake test:plugins
要测试rails应用程序的所有插件,请参阅的第6章中的更多内容,这仅在gem位于应用程序的供应商目录中时有效

另一种可能性是通过包含测试任务来修改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

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

我肯定一直在阅读有关测试的内容。我现在已经习惯了它的基本原理。我只是有点不确定如何处理这个问题,因为它特定于mysql适配器,我需要拉入ActiveRecord,然后在测试中应用我的补丁,然后调用reponds_?或者看看它是否对我添加的方法有反应?我在这里大概吗?我不明白你的代码,不知道你想要实现什么。但是它改变了mysql适配器的行为,所以只需检查行为的改变是否符合您的预期行为。在您的情况下,您可能确实应该获取一些ActiveRecords,以查看mysql适配器是否正常工作。如果很难根据您的测试动态应用修补程序,您可以跳过原始情况下的测试结果。代码只是在运行每个select之前运行MySQL EXPLAIN语句。这只是为了提醒我添加索引。我发现测试令人困惑,因为我想将其与rails应用程序分开打包。我希望它是一个宝石,这样我就可以用我的其他项目。那么,在没有Rails应用程序的情况下,如何测试对mysql连接的更改呢?它从哪里获得连接凭据?有可能单独测试这种东西吗?哦。。。我不明白你想测试宝石,我在回答中添加了一些解释。
task :default => :test