数据库单元测试 - 如何模拟过程中的时间

Database unit testing - How to mock the time within a procedure

我在 Azure 数据库实例中有一个 TSQL 过程。该过程具有确定 ETL 过程状态的逻辑,并且 对当前时间敏感 以确定事件是否在范围内。此过程具有复杂的行为, 是核心要求

我必须验证过程的行为。我正在 Python 中编写单元测试,我正在使用 unittest 来管理测试,并使用 pyodbc 来调用数据库。这些单元测试必须验证过程的行为,而不管调用过程的时间如何。 我需要数据库表现得像某个时间,例如“05:30:00”

我熟悉模拟对象的概念以随时 运行 测试并删除外部依赖项。我认为这不适用于 Microsoft 数据库,例如更像是 REST API。另一个考虑因素是 我不想将我想要测试的对象 的副本作为目标,因为副本可能与原始副本不同。

想到的唯一解决方案(不好的解决方案)是:

结果 1 将是;

2 的结果是;

这两个选项都很糟糕。有人解决过这种问题吗?

过程 将不会 从过程中使用 GETDATE() 访问时间。 DATETIME 将提供给外部范围 提供的 过程参数。

这将需要进行一些重构,但意味着该过程随后可以进行单元测试。希望我能更快地想到它:/