如何用phpunit测试复杂的购买?

时间:2017-05-12 06:33:17

标签: postgresql unit-testing common-table-expression

我是单位测试的新手,我想我需要测试购买流程, 但它很复杂。

在我们的项目中,我们有一个用户的采购流程 这包括两个阶段

  1. 用户下订单,用户被重定向到付费门 我们用该订单保存客户的电子邮件。
  2. Paygate向我们发送付款状态(成功或失败)的订单信息 如果成功的话 我们运行使用postgresql CTE和
    的单一复杂sql查询 如果用户不存在,查询将创建用户,请插入其他一些行,
    查询还返回在发送的电子邮件中使用的电子邮件地址 如果新用户已创建,则为用户。
  3. 我尝试测试第二阶段。

    测试的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"  
    

1 个答案:

答案 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;

如果有任何异常,交易将被中止