在测试无服务器应用程序时,是否可以在赛普拉斯中设置API请求以设置测试?

问题描述 投票:0回答:1

我正在使用AWS Amplify编写无服务器的React应用程序。我使用赛普拉斯进行了E2E测试。

在每次测试之前,我通过AWS Amplify CLI登录用户。然后,我清除开发服务器上的所有数据,并使用fixture来创建一些新数据。这样我每次测试都有控制状态(见下面的代码)。

我的问题是:这是一个好习惯吗?或者在每次测试之前对服务器发出那么多请求是不是很糟糕?如果它不好,如果你没有直接访问服务器(再次无服务器)来运行像cy.exec('npm run db:reset && npm run db:seed')这样的命令,你会怎么做?赛普拉斯确实在控制台中警告我使用承诺:

Cypress detected that you returned a promise in a test, but also invoked one or more cy commands inside of that promise.

这是我使用的代码:

import API, { graphqlOperation } from '@aws-amplify/api';
import Auth from '@aws-amplify/auth';
import Amplify from 'aws-amplify';
import * as R from 'ramda';

import config from '../../src/aws-exports';
import { contacts } from '../../src/contacts/fixtures';
import { replaceEmptyStringsWithNull } from '../../src/contacts/helpers';
import {
  createContact as addMutation,
  deleteContact as deleteMutation
} from '../../src/graphql/mutations';
import { listContacts } from '../../src/graphql/queries';

Amplify.configure(config);

const deleteContact = input =>
  API.graphql(graphqlOperation(deleteMutation, { input }));

const createContact = input =>
  API.graphql(graphqlOperation(addMutation, { input }));

describe('Contactlist', () => {
  beforeEach(async () => {
    await Auth.signIn(Cypress.env('email'), Cypress.env('password'));
    const allContacts = await API.graphql(graphqlOperation(listContacts));
    await Promise.all(
      R.map(
        R.pipe(
          R.prop('id'),
          id => ({ id }),
          deleteContact
        )
      )(allContacts.data.listContacts.items)
    );
    await Promise.all(
      R.map(
        R.pipe(
          R.dissoc('id'),
          replaceEmptyStringsWithNull,
          createContact
        )
      )(contacts)
    );
  });

  // ... my tests
e2e-testing serverless cypress aws-appsync aws-amplify
1个回答
0
投票

这将是我进行测试的方式。我喜欢从一个完全受控的状态开始,即使这意味着有多个API调用作为before()

© www.soinside.com 2019 - 2024. All rights reserved.