我已经将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']
,但这完全取决于我的机器。如果我只是期待那样,没有其他人能够顺利通过测试。
如何处理第二个示例中的跨环境测试?你如何使其足够通用以涵盖测试代码?
答案 0 :(得分:1)
device_names
方法中的一段代码可能会调用其他Ruby类中的某些方法,然后这些调用的结果会被代码操纵。您可以将这些调用存根并单独测试您的方法。
这是一个如何在String类的任何实例上创建存根的(愚蠢)示例:
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"
当然,您也可以在单个实例中存储方法,用于特定参数,等等。详细了解stubbing methods。
现在您知道平台特定代码将返回什么,您可以测试您的方法并始终获得预期的结果。