如何使用cypress.io更改db中记录的属性

时间:2019-01-29 09:09:04

标签: node.js database cypress

我是赛普拉斯的新手,我想知道如何进行以下检查: 我有情况: 我在数据库中有一个产品,其状态可以为:InStock和OutOfStock以及已停产。如果产品处于“ InStock”状态,则应该可以将其发送给客户,如果产品处于“ OutOfStock” /“已停产”状态,则不能将其发送给客户。 通过api调用,我可以将产品分发给客户。如果产品处于“ InStock”状态,则api响应为200,否则返回状态码为400。 所以我的问题是:如何为每个测试更改数据库中产品的状态,以便可以检查3种状态中的每一种(如果api返回正确的响应)?我知道如何检查api响应本身,但是我不清楚如何在每次测试之前更改db中产品的状态。

2 个答案:

答案 0 :(得分:0)

您想模拟您的api调用,以便它响应您想要的内容。赛普拉斯称其为存根。这将使您能够截获Rest呼叫并将其替换为所需的呼叫。您也可以调用API来重置数据库,但是我不建议这样做。

https://docs.cypress.io/guides/guides/network-requests.html#Requests

import scala.concurrent.ExecutionContext

def withBag(body: Bag => Result)(implicit ec: ExecutionContext): Future[Result] =
  withBagAsync(bag => Future(body(bag)))

答案 1 :(得分:-1)

与@Maccurt不同,我实际上按照您提出的方式(更改数据库)进行操作,以便您可以正确地测试e2e流程。

您可以使用cy.task与可以直接写入DB的Cypress Runner的节点进程进行通信,而不必设置将写入DB的测试路由。看起来像这样:

在此示例中,使用postgres(node-postgres)。

your-test.spec.js

describe("test", () => {
    it("test", () => {
        cy.task("query", {
            sql: `
                UPDATE product
                SET status = $1
                WHERE id = $2
            `,
            values: [ "InStock", 40 ]
        });

        // your cy assertions here
    });
});

cypress/plugins/index.js

const pg = require("pg");
const pool = /* initialize your database connection */;

module.exports = ( on ) => {

    on( "task", {
        query ({ sql, values }) {

            return pool.query( sql, values );
        }
    });
});