如何测试嵌入式ruby应用程序?

时间:2014-03-05 15:20:33

标签: ruby unit-testing rspec

我在c应用程序中运行了一个嵌入式ruby解释器,以及一个作为c应用程序接口的ruby类。所以它看起来像这样:

class MyApi
  include RealCAPI

  def api_method
    some_call_to_c_api
  end 

end

在与api交互的ruby类中,我有类似的东西。我创建一个MyApi类的实例,然后调用该实例上的方法。

class Foo

  def initialize
    api = MyApi.new
    ...
    ...
  end

  def do_something
     bar = api.api_method
     ...
     ...
     ... 
     final_result  #is a function of Foo methods but depends on something from the api
  end

end

我想用这样的东西来测试Foo类:

describe Foo do
  it "should do something" do
    foo = Foo.new
    expect(foo.do_something to eq("something")
   end
end

问题是对api的调用都不会在c应用程序之外工作。 我如何测试这个Foo类?

我是否尝试以某种方式在c应用程序内部进行测试?

我是否只编写一个独立的测试“模拟”MyApi类,模仿c应用程序中发生的事情?

我意识到如果我模拟api我无法真正测试它,但至少我能测试使用它的类,对吗?

1 个答案:

答案 0 :(得分:0)

我认为你必须嘲笑api,就像你说的那样。你在这里测试的是ruby代码,所以你应该坚持使用它并仅测试 ruby​​代码。

你会得到一些说法:如果我的api做了某事,那么我的ruby代码完全按照指定的方式工作。哪个好,并且不依赖于你的api工作与否。

当然,您可能需要为您的api编写一些测试。但保持两个测试分开对我来说似乎是一个好主意!

修改

不确定这是否是您的问题,但这可以通过使用类似

的方式轻松完成
it "should do something" do 
  MyApi.any_instance.stub(:ping).and_return("pong") #so that when foo calls ping, the api returns "pong"
  foo = Foo.new
  expect....
end