2016-11-08 29 views
5

我正在用C++测试谷歌测试单元测试。在我们的公司代码中,我们仍然存在问题,例如CTime的系统数据类型使用例如实际系统的时区(我们使用CTime数据类型与生产代码中的相同方式)。对于单元测试,我们想要模拟不同的时区,因为我们有很多问题。C++:如何使用谷歌测试在单元测试中模拟不同的时区

我已经投入了几个小时研究别人怎么做,因为它不可能,其他公司没有这个问题:)但我没有找到解决方案。 我的想法如下: CTime本身可以节省UTC时间,并将其按需转换为当地时间。我的假设是所有这些函数都需要在timezonapi.h中声明的GetTimeZoneInformation()函数。

WINBASEAPI 
_Success_(return != TIME_ZONE_ID_INVALID) 
DWORD 
WINAPI 
GetTimeZoneInformation(_Out_ LPTIME_ZONE_INFORMATION lpTimeZoneInformation); 

因此,解决方案将可能是由某个自定义函数,然后返回一个对象,我可以根据需要改变来交换这个GetTimeZoneInformation()功能。但我不知道该怎么做,我也不知道这是否正常工作,因为它可能只在应用程序启动时调用此函数一次。

有谁知道如何处理这个话题?我不想改变任何行为,我只想在不破坏任何时间计算机制的情况下设置自己的时区。最好的情况是,如果我能以某种方式模拟这些调用而不更改生产代码。 事情是,这个程序是非常大,老,... ...尽可能少变化总是最好:)

如果我还没有找到一个已经存在的职位,解决了我的问题,然后我真的很抱歉,因为我没有找到它,或者我没有得到这可以帮助我。

+1

它看起来像你想我们为你写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出以及实际获得的输出(控制台输出,回溯等)。您提供的细节越多,您可能会收到的答案就越多。检查[FAQ]和[问]。 –

回答

0

正如你在你的问题中提到的,嘲笑是解决这个问题的好方法。

我知道的最快,最简单的方法是通过包装所有你想在一个新的类,它实现“战略”的设计模式来测试方法:

它可以真正的实现和嘲笑,曾经之间切换你将逻辑设置为模拟,它会返回一个模拟值。

默认情况下,它应该设置为真正的实现。

简单的例子用“诠释美孚()”:

Class Strategy{ 
      int Foo() = o 
    } 

    Class StrategyImplementation 
    { 
    private: 
      Strategy* logic; 
    public: 
      void SetLogic(Strategy* newLogic){logic=newLogic)} 
      int Foo(){return logic->Foo()} 
    } 

    Class mock : public Strategy{ 
    public: 
      SetValue(int value){this.value = value} 
      int Foo(){return value} 
    private: 
      int value; 
     } 

    Class Implementation : public Strategy{ 
     int Foo(){ here_you_call_the_method_you_want_to_test } 
    } 

所有被留下,是通过使用'来GetTimeZoneInformation的每次调用更改为新的战略, 做到这一点的最简单的方法,将辛格尔顿的设计模式。

它不具有高风险和变化,你需要做的是改变从“富()”来调用“StrategyImplementation ::的GetInstance()。美孚()”