gpt4 book ai didi

node.js - 模拟 Postgresql now() 函数进行测试

转载 作者:搜寻专家 更新时间:2023-10-31 23:23:21 24 4
gpt4 key购买 nike

我有以下堆栈

  • Node/Express 后端
  • Postgresql 10 数据库
  • 用于测试的 Mocha
  • Sinon 用于 mock

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

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

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

问题当然是 sinon 不能覆盖 now() 函数。

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

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

最佳答案

这是一个想法:使用 mock_dates 表创建您自己的 mock_now():

create table mock_dates (
id serial PRIMARY KEY,
mock_date timestamptz not null
);

create or replace function mock_now()
returns timestamptz
as $$
declare
RET timestamptz;
begin
-- Delete first added date and assign it to RET
delete from mock_dates where id in (
select id from mock_dates order by id asc limit 1
)
returning mock_dates.mock_date into RET;

-- If no deletion happened just return the current timestamp
if RET is null then
return now();
end if;

-- Otherwise return the mocked date
return RET;
end;
$$
language plpgsql;

并插入一些模拟日期

insert into mock_dates (mock_date) values ('2001-03-11 02:34:00'::timestamptz);
insert into mock_dates (mock_date) values ('2002-05-22 01:49:00'::timestamptz);

并使用 mock_now() 而不是 now()。它将一次返回插入到 mock_dates 表中的时间戳(先进先出)。

当表格为空时,它将像默认的 now() 一样工作。

只需确保 mock_dates 表在生产中为空 😁

或者您甚至可以为生产定义一个不同的函数,它甚至不会尝试读取 mock_dates 表。

关于node.js - 模拟 Postgresql now() 函数进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48243934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com