ruby - 在 Ruby 中测试设备相关代码

标签 ruby testing rspec minitest

对于具有简单算法的 Rails 应用程序和库,我同时使用了 rspec 和 minitest。我的意思是,如果我有

def add(a, b)
  a + b
end

这很容易测试。我希望 add(2, 2) 等于 4

但是假设我有依赖于某台机器的方法。

def device_names
  # some code to return an array of device names
end

我会得到,例如,['CPU', 'GPU', 'DSP'],但这完全取决于我的机器。如果我只是期望的话,没有其他人能够成功通过测试。

你如何处理第二个例子中的跨环境测试?您如何使其足够通用以涵盖该代码以进行测试?

最佳答案

device_names 方法中的代码片段可能会调用其他 Ruby 类中的某些方法,然后这些调用的结果将由您的代码进行操作。您可以 stub 这些调用并单独测试您的方法。

这是一个(愚蠢的)示例,说明如何在 String 类的任何实例上创建 stub :

String.any_instance.stub(:downcase).and_return("TEST")

现在,对任何 String 实例调用 downcase 都会返回“TEST”。您可以在 irb 中使用它:

irb(main):001:0> require 'rspec/mocks'
=> true
irb(main):002:0> RSpec::Mocks::setup(self)
=> #<RSpec::Mocks::Space:0x10a7be8>
irb(main):003:0> String.any_instance.stub(:downcase).and_return("TEST")
=> #<RSpec::Mocks::AnyInstance::StubChain:0x10a0b68 @invocation_order={:stub=>[nil], :with=>[:stub], :and_return=>[:wit
, :stub], :and_raise=>[:with, :stub], :and_yield=>[:with, :stub]}, @messages=[[[:stub, :downcase], nil], [[:and_return,
"TEST"], nil]]>
irb(main):004:0> "HAHA".downcase
=> "TEST"

当然,您也可以将方法 stub 在单个实例中,针对特定参数等等。在 stubbing methods 上阅读更多内容.

现在您知道平台特定代码将返回什么,您可以测试您的方法并始终获得预期结果。

关于ruby - 在 Ruby 中测试设备相关代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13716967/

相关文章:

ruby - 如何在 Ruby 中使用 Logger 而不是 put 而不使用全局变量

python 单元测试 assertRaises

javascript - Protractor - 无法运行 Protractor 测试

ruby-on-rails - 助手规范中未定义路径

ruby - 匹配字符串中孤立的 % 所需的正则表达式

ruby-on-rails - 如何替换 Rails 控制台中的现有类?

ruby-on-rails - 对来自 assert_select 测试的 rspec 反馈感到困惑

php - 使用 phpspec 在命令处理程序中测试工厂方法

ruby-on-rails - 使用 Rails 2.3.8 和 Bundler 运行 RSpec 测试时为 "uninitialized constant"

rspec - 在自动测试中使用 rspec 标签