C ++:如何使用谷歌testing在unit testing中模拟不同的时区

我正在用C ++testingunit testing。 在我们的公司代码中,我们仍然存在这样的问题:例如CTime的系统数据types使用例如实际系统的时区(我们在生产代码中使用CTime数据types)。 对于unit testing,我们要模拟不同的时区,因为我们有许多问题。

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

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

所以解决scheme可能是通过自定义函数交换GetTimeZoneInformation()函数,然后返回一个对象,我可以根据需要进行更改。 但是我不知道该怎么做,而且我也不知道这是否正常工作,因为它可能只是在应用程序启动时调用这个函数。

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

如果我没有find已经存在的post来解决我的问题,那么我真的很抱歉,因为我没有find它,或者我没有得到这可以帮助我。

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

我所知道的最快最容易的方法就是将所有想要测试的方法都包装在一个实现了“策略”设计模式的新类中:

它可以在真正的实现和模拟之间切换,一旦你设置逻辑模拟,它会返回一个模拟值。

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

'int Foo()'的简单例子:

  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的每个调用都改为新的策略,最简单的方法就是使用“Singleton”设计模式。

它没有高风险,你需要做的改变是将调用从'Foo()'改变为'StrategyImplementation :: GetInstance()。Foo()'