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

C++;:如何使用googletest模拟单元测试中的不同时区 我在C++中使用谷歌测试进行单元测试。在我们的公司代码中,我们仍然存在一个问题,即系统数据类型(例如CTime)使用实际系统的时区(我们使用CTime数据类型的方式与生产代码中相同)。对于单元测试,我们希望模拟不同的时区,因为我们在这方面有很多问题,c++,windows,googletest,C++,Windows,Googletest,我已经花了数小时研究其他公司是如何做到这一点的,因为这是不可能的,其他公司没有这个问题:)但我没有找到解决办法。 我的想法是这样的: CTime本身以UTC格式保存时间,并根据需要将其转换为本地时间。我的假设是,所有这些函数都需要在timezonapi.h中声明的GetTimeZoneInformation()功能 WINBASEAPI _Success_(return != TIME_ZONE_ID_INVALID) DWORD WINAPI GetTimeZoneInformation(_O

我已经花了数小时研究其他公司是如何做到这一点的,因为这是不可能的,其他公司没有这个问题:)但我没有找到解决办法。 我的想法是这样的: CTime本身以UTC格式保存时间,并根据需要将其转换为本地时间。我的假设是,所有这些函数都需要在timezonapi.h中声明的GetTimeZoneInformation()功能

WINBASEAPI
_Success_(return != TIME_ZONE_ID_INVALID)
DWORD
WINAPI
GetTimeZoneInformation(_Out_ LPTIME_ZONE_INFORMATION lpTimeZoneInformation);
因此,解决方案可能是通过一个自定义函数来交换GetTimeZoneInformation()功能,该函数返回一个我可以根据需要更改的对象。但是我不知道怎么做,我也不知道这是否有效,因为它可能只在应用程序启动时调用这个函数一次

有人知道如何处理这个话题吗?我不想改变任何行为,我只想在不破坏任何时间计算机制的情况下设置自己的时区。最好的办法是,我可以在不改变生产代码的情况下模拟这些调用。 问题是这个项目很大,很老,而且。。。尽可能少的改变总是最好的:)


如果我还没有找到一个已经存在的帖子来解决我的问题,那么我真的很抱歉,因为我要么没有找到它,要么我不知道这能帮到我。

正如你在问题中提到的,模仿是解决这个问题的好方法

我知道的最快、最简单的方法是将所有要测试的方法包装到一个新类中,该类实现“策略”设计模式:

它可以在真实实现和模拟之间切换,一旦您将逻辑设置为模拟,它将返回一个模拟值

默认情况下,它应该设置为实际实现

使用“int Foo()”的简单示例:

剩下的就是将GetTimeZoneInformation的每次调用都更改为新策略, 最简单的方法是使用“单例”设计模式


它没有高风险,您需要做的更改是将调用从“Foo()”更改为“StrategyImplementation::GetInstance().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 }
    }