0

我已经将 rspec 和 minitest 用于具有简单算法的 Rails 应用程序和库。我的意思是,如果我有

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']但这完全取决于我的机器。如果我只是期待的话,没有其他人能够成功通过测试。

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

4

1 回答 1

1

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

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

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

downcase现在对任何 String 实例的任何调用都将返回“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"

当然,您也可以对单个实例中的方法、特定参数等进行存根。阅读更多关于存根方法的信息。

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

于 2012-12-05T09:32:53.127 回答