我是单位测试的新手,我想我需要测试购买流程, 但它很复杂。
在我们的项目中,我们有一个用户的采购流程 这包括两个阶段
我尝试测试第二阶段。
测试的Exapmles包含对sum(),
等简单函数的测试
我知道复杂的过程必须分解为简单的代码片段,并且每个片段必须与其他片段无关。
但是,如果事务中每个查询的每个结果都取决于previos查询的结果,我必须如何测试sql事务?
例如
upsert user
如果插入了用户(如果是新的话)
然后将用户添加到订阅者表
如果用户从合作伙伴注册,则添加有关此事件的合作伙伴通知
等等
Previos逻辑用单个sql查询编写。 我应该如何测试每个查询改变数据的权利?
或者我应该在事务中逐个重写cte查询吗? 如果是这样,如何理解是否从事务中创建了新用户?
查询现在看起来像
WITH "exists_user" AS (
SELECT "email",0 "created_user"
FROM "user"
WHERE "email"='email'
),
"inserted_user" AS (
INSERT INTO "user"("email")
VALUES('email')
WHERE NOT EXISTS (SELECT 1 FROM "exists_user")
RETURNING "email" ,1 "created_user"
)
SELECT * FROM "exists_user"
UNION ALL
SELECT * FROM "inserted_user"
答案 0 :(得分:0)
to do some logic between statements, use plpgsl inside DO
阻止,例如:
DO
$$
declare
_email text := 'email@email';
_c int;
_t text;
begin
SELECT count(1) into _c
FROM "user"
WHERE "email"=_email;
IF _c < 1 then
RAISE EXCEPTION '%', 'aborting: no email found';
END IF;
INSERT INTO "user"("email")
VALUES('email')
WHERE NOT EXISTS (SELECT 1 FROM "exists_user")
RETURNING "email" into _t;
IF _t = _email THEN
RAISE INFO '%',concat('created',_t);
END IF;
END;
$$
;
我知道这里的逻辑是无意义的 - 这只是将代码移植到plpgsql逻辑的例子。
您还可以在一个事务中放置几个这样的DO
语句,例如:
BEGIN;
DO.....
DO.....
select now();
END;
如果有任何异常,交易将被中止