Как изменить свойство записи в db с помощью cypress.io
Я новичок в Cypress, и мне интересно, как я могу сделать следующие проверки: У меня есть дело: У меня есть продукт в БД, который может иметь статусы: InStock и OutOfStock и Discontinued. Если продукт находится в состоянии "InStock", я должен иметь возможность отправить его клиенту, если в "OutOfStock" / "Discontinued" я не смогу отправить его клиенту. С помощью API я могу отправить продукт клиенту. Если продукт находится в состоянии "InStock", ответ API равен 200, если нет ответа с помощью statusCode 400. Поэтому мой вопрос: как я могу изменить статус продукта в БД для каждого теста, чтобы я мог проверить каждый из 3 статусов (если API возвращает правильный ответ)? Я знаю, как проверить сам ответ API, но мне не ясно, как менять статус продукта в БД перед каждым тестом.
2 ответа
В отличие от @Maccurt, я бы сделал это так, как вы предлагаете (измените базу данных), чтобы вы могли правильно протестировать поток e2e.
И вместо настройки тестовых маршрутов, которые будут записывать в БД, вы можете использовать cy.task
поговорить с процессом узла Cypress Runner, который может записывать в БД напрямую. Это будет выглядеть так:
Использование 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 );
}
});
});
Вы хотите издеваться над своим вызовом API, чтобы он отвечал тем, что вы хотите. Кипарис называет это заглушкой. Это позволит вам перехватить вызов Rest и заменить его на то, что вы хотите. Вы также можете вызвать API для сброса вашей БД, но я бы не советовал.
https://docs.cypress.io/guides/guides/network-requests.html
cy.server() // enable response stubbing
cy.route({
method: 'GET', // Route all GET requests
url: '/users/*', // that have a URL that matches '/users/*'
response: [] // and force the response to be: []
})