Ruby on rails 测试Rails mysql适配器的补丁
我为Rails MySQLAdapter编写了一个小monkeypatch,并希望将其打包,以便在我的其他项目中使用。我正在尝试为它编写一些测试,但我对测试还是新手,我不知道如何测试它。有人能帮我开始吗 下面是我要测试的代码: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
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