使用存根和模拟在C ++中进行有效测试? (可能?)

时间:2010-09-24 10:38:45

标签: c++ testing tdd

我正在寻找一些测试这个(Objective-)C ++代码的样式建议,我将Objective部分括起来,因为我认为它不应该对这个测试有任何影响。

class Probe
{
  public:
    bool playing();
}

bool Probe::playing()
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];

  // Logic here to determine if iTunes is playing requires a running iTunes.
  // The behavior can also differ depending if iTunes is playing a DVD, CD, 
  // Stream, a File, something from the iTunes store, and a bunch of other factors

  [pool release];
  return 1;
}

如代码中所提到的,此方法的行为挂在上游环境细节上,在运行测试时我不能依赖它(我还没有开始编写。)

如何有效地测试这些条件,您依赖脚本桥,com适配器或上游API。例如,我想确保另一种方法print_whats_playing()不会打印任何内容,如果没有播放,或者以理智的方式满足某些其他条件。

有一个第二个论点,即隔离(而不是为了方便)我的测试套件实际上需要点击这些系统服务或API,也许机器构建是防火墙的,并且无法达到API或某些其他条件。特别是在这种情况下,如何确保API调用(网络或本地)失败,以便您可以正确测试代码中的错误条件?

在我的家(Ruby-land)中你会“存根”(参见http://martinfowler.com/articles/mocksArentStubs.html)或“模拟”这个角色,这在Ruby中很容易,因为你可以简单地重新定义一个测试类。

此外,在个别测试用例中,您可以通过类似probe.expects(:playing).once.returns(false)之类的方法来短路方法 - 在C ++中自然不会那么容易,但也许我可以享受一些东西?

2 个答案:

答案 0 :(得分:1)

如果你仍然在C ++中寻找一个真正的Mocking框架,你应该从Typemock中检查Isolator++。 它可以模拟C ++中的任何调用,从你的角度看它唯一的缺点是它目前只能在windows中运行。

答案 1 :(得分:0)

所以,我找到了我的解决方案,在篡改了维基百科的C ++测试框架之后,我偶然发现了GoogleTest和Google C++ Mocking Framework。它满足了我的所有要求,虽然使用起来比Ruby同行要复杂一点,但它的功能同样出色。

有一点我不是很高兴,或者肯定是存根系统调用 - 看起来好像我必须将它们包装在我自己的课程中然后我可以模拟回复 - 我没有强烈的感觉关于这一点的方式,但它感觉不是最佳的,尽管我可以清楚地了解依赖于哪些系统功能。