模拟 Postgresql now() 函数进行测试

Jor*_*ans 8 postgresql mocha.js node.js sinon

我有以下堆栈

  • 节点/Express 后端
  • PostgreSQL 10 数据库
  • 摩卡测试
  • 嘲笑的诗乃

我编写了一堆端到端测试来测试我所有的网络服务。问题是其中一些是时间相关的(如“给我最后 X 秒的修改记录”)。

sinon非常擅长模拟 Node 中所有与时间/日期相关的内容,但是modified我的 Postgresql 表中有一个字段填充了触发器:

CREATE FUNCTION update_modified_column()
  RETURNS TRIGGER AS $$
BEGIN
  NEW.modified = now();
  RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

问题当然是sinon无法覆盖该now()功能。

关于如何解决这个问题的任何想法?问题不是在测试开始时设置特定日期,而是提前时间比实时快(在我的一个测试中,我想更改数据库中的某些内容,将“当前时间”提前一天,更改数据库中还有一些东西,并进行网络服务调用以查看结果)。

我自己可以找出一些解决方案,但它们都涉及更改应用程序代码并使其不那么优雅。我认为您的应用程序代码不应受到您想要测试它的影响。

Pau*_*aul -1

老实说,数据库内部的东西总是很难从应用程序代码中进行测试。根据我的经验,最好的办法就是验证记录的状态。

因此,不要专门测试 now 函数是否在内部调用,而是编写一个创建新记录的测试,然后验证该记录已创建并修改了字段集。那时它们应该彼此相等,并且可能在最后一两秒内,所以这就是您可以编写断言的所有内容。

然后,您编写另一个测试来更改记录中的某些值,并编写断言:修改后的标记与创建的标记不同,是更新的,并且可能在最后一秒或两秒内。

  • 是的,但这不是主题。我不想测试数据库。我希望在我的端到端测试中看到一周前修改的一些内容返回到我的“一周前修改了什么内容”网络服务中(过于简单化,但我希望您理解它:))。 (2认同)