ruby-on-rails - 如何测试使用系统命令的代码

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

我正在编写一个简单的库来检查 mysql 服务器是否存在并依赖于结果,它还做其他事情。为了检查连接,我使用了这样的代码:

def check_connection
  result = if @password
    `mysqladmin -u#{@username} -p#{@password} ping`
  else 
    `mysqladmin -u#{@username} ping` 
  end
  parse_result(result)
end

如何测试这个方法?我想,我不应该在测试期间连接到 mysql 服务器。我唯一的想法是在一种方法中返回用于 ping 的适当字符串命令(取决于密码的使用)并在如下方法中使用它:

def check_connection(ping_string)
  `#{ping_string}`
end

并且在每个测试中只模拟这个方法,因此只有这个方法使用命令。

您会如何正确测试它?

最佳答案

您可以坚持使用原始代码,并像这样处理它:

  1. 确保 parse_result 已经过单元测试。
  2. 模拟 check_connection,以便您的其余测试不会最终触发对 mysqladmin 的调用。

与 mysql 本身的连接没有经过测试,这是一个漏洞,但我认为这没什么大不了的。测试 ping_string 不会真正堵住那个洞,并且鉴于对 mysqladmin 的调用基本上是硬编码的,所以这里的风险很小。

关于ruby-on-rails - 如何测试使用系统命令的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5326981/

相关文章:

c# - 使用 Rhino Mocks 变干

AngularJS- 对匿名 Controller 进行单元测试

ruby-on-rails - 运行 ruby​​ 脚本时,Heroku 上的 Ruppell 套接字崩溃(权限被拒绝)

ruby-on-rails - rails 中的 session 和 user_id

ruby-on-rails - 使用方法 Date.commercial 无法找到第 53 周的开始

ruby - 是否有一个 if 语句后跟另一个以在 ruby​​ 中以 'and' 运算符 (&&) 结束该行的原因?

ruby - 没有这样的文件或目录 - ruby

ruby-on-rails - 在 Rails 中使用观察者模式时传递实例变量

ruby-on-rails - 使用 ActiveMerchant 和 PayPal 在实时网站上接受虚拟信用卡

c - 如何模拟 send() 以便对函数 commSendPacket 进行单元测试?