当前位置: 首页 > 知识库问答 >
问题:

cypress测试前如何准备Db?

翟修明
2023-03-14

我正在使用cypress来测试我的后端节点api。

我想在之前的函数中将我的数据库重置为干净状态。这包括使用axios(因此接受promise)发送帖子,放置

我熟悉cypress的commands文件(已经将其用于我的登录功能),但我似乎无法使其适用于我的“reset db”行为。

因此,我简化了这个问题,直到在“it”功能中发布我的用户,但它仍然不起作用

柏树试验:

const axios = require('axios')

describe('Auth', function() {
  beforeEach(function() {
    cy.visit('http://localhost:8080')
  })

  describe('login with non existing user', function() {
    it('should show an error message', function() {      
      cy.login('non.existing.user@example.com', 'password')
      cy.get('#app > div.container > div > div > div > div > div > form > div.alert.form-group.alert-danger')
        .should('have.text', 'Invalid Credentials')
    })
  })


  describe('login with an invalid password', function() {
    it('should show an error message', async function() {
      cy.putUserToDb('existingUser', 'existing.user@test.test', 'Existing User', 'password')
      cy.login('existing.user@test.test', 'pass')
      cy.get('#app > div.container > div > div > div > div > div > form > div.alert.form-group.alert-danger')
        .should('have.text', 'Invalid Credentials')
    })
  })
})

柏树命令:

const axios = require('axios')
const bcrypt = require('bcrypt')

Cypress.Commands.add("login", (email, password) => {
  cy.contains('Log In')
    .click()
  cy.url()
    .should('include', '/signin')
  cy.get('#app > div.container > div > div > div > div > div > form > div:nth-child(1) > input')
    .clear()
    .type(email)
    .should('have.value', email)
  cy.get('#app > div.container > div > div > div > div > div > form > div:nth-child(2) > input')
    .clear()
    .type(password)
    .should('have.value', password)
  cy.get('#app > div.container > div > div > div > div > div > form > div:nth-child(3) > button')
    .click()
})

Cypress.Commands.add("putUserToDb", async (id, email, name, password) => {
  const jsonServerUrl = 'http://localhost:5000'
  console.log(`${jsonServerUrl}/users/${id}`)
  await axios
    .put(`${jsonServerUrl}/users/${id}`, {
      email: email,
      name: name,
      password: bcrypt.hashSync(password)
    })
})

我在cypress中发现以下错误:

tests?p=cypress\integration\auth.js-872:37810 Uncaught Uncaught TypeError: Cannot read property '_handle' of undefined

This error originated from your test code, not from Cypress.

When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.

Cypress could not associate this error to any specific test.

We dynamically generated a new test to display this failure.

Check your console for the stack trace or click this message to see where it originated from.
    at http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:37810:16
    at Array.forEach (<anonymous>)
    at module.exports (http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:37809:36)
    at Object.<anonymous> (http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:35419:1)
    at Object.249._process (http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:35719:4)
    at o (http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:1:265)
    at http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:1:316
    at Object.<anonymous> (http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:32284:11)
    at Object.242.../package.json (http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:32473:4)
    at o (http://localhost:59099/__cypress/tests?p=cypress\integration\auth.js-872:1:265)

你知道如何在一组测试前正确重置我的数据库吗?

提前谢谢!

共有1个答案

益兴生
2023-03-14

我终于明白了问题所在:只是bcrypt库在使用底层C库,因此在节点中工作,而不是在浏览器中工作。用bcryptjs替换它解决了我的问题。

之后,由于我的putUserToDb命令未返回Cypresspromise,我的测试无法正常工作。

修复这个问题后,我的代码现在看起来像这样:

command.js:

import axios from 'axios'
import bcrypt from 'bcryptjs'

Cypress.Commands.add("login", (email, password) => {
  cy.contains('Log In')
    .click()
  cy.url()
    .should('include', '/signin')
  cy.get('#app > div.container > div > div > div > div > div > form > div:nth-child(1) > input')
    .clear()
    .type(email)
    .should('have.value', email)
  cy.get('#app > div.container > div > div > div > div > div > form > div:nth-child(2) > input')
    .clear()
    .type(password)
    .should('have.value', password)
  cy.get('#app > div.container > div > div > div > div > div > form > div:nth-child(3) > button')
    .click()
})

Cypress.Commands.add("putUserToDb", (id, email, name, password) => {
  const jsonServerUrl = 'http://localhost:5000'
  return new Cypress.Promise((resolve, reject) => {
     axios.put(`${jsonServerUrl}/users/${id}`, {
      id: id,
      email: email,
      name: name,
      password: bcrypt.hashSync(password)
    })
    .then((data) => {
      resolve()
    })
    .catch((err) => {
      reject(err)
    })
  })
})

auth.js:

describe('Auth', function() {
  before(() => {
    cy.putUserToDb('existingUser', 'existing.user@test.test', 'Existing User', 'password')
  })

  beforeEach(function() {
    cy.visit('http://localhost:8080')
  })

  describe('login with non existing user', function() {
    it('should show an error message', function() {
      cy.login('non.existing.user@example.com', 'password')
      cy.get('#app > div.container > div > div > div > div > div > form > div.alert.form-group.alert-danger')
        .should('have.text', 'Invalid Credentials')
    })
  })


  describe('login with an invalid password', function() {
    it('should show an error message', function() {
      cy.login('existing.user@test.test', 'pass')
      cy.get('#app > div.container > div > div > div > div > div > form > div.alert.form-group.alert-danger')
        .should('have.text', 'Invalid Credentials')
    })
  })
})
 类似资料:
  • 概述 使用 # 开发期间 cypress open # 自动执行或在CI中执行 cypress run 测试四步骤 Cypress测试四步骤: 打开一个网页: cy.visit('https://example.cypress.io') 找到目标元素 cy.get('#element-id') 跟目标元素交互 cy.get('#element-id').click() 执行assert

  • 我正在尝试为kafka消息传递设置集成测试,并从使用Embedded-Kafka转向使用TestContainers。给定docker-compose的以下配置和所有集成测试的基类: Kafka-compose.yaml: 我遇到的问题很少: 似乎spring-Kafka和它的在所有可能的用@springboottest注释的测试中都是活动的,而不仅仅是在Kafka特定的测试中。这意味着发送到Ka

  • 设计岗校招最耗费精力的就是各种测试题了,大家需要具备扎实的设计基础和良好的设计思维,这是通过测试题的基础。如果时间允许的话针对各个大厂的测试题风格和方案产出要求,需要有针对性地进行练习和准备,熟悉各种设计方向设计工具使用。 在准备测试题的过程中,需要注意以下几点: 多看各公司的测试题可以更好地了解各个公司的测试题风格和方案产出要求,同时也可以帮助你熟悉各种设计工具和软件的使用。 注重细节:测试题的

  • 对刚毕业的学生面试要求低?凭缘分? 越了解越知道,面试环节有这么大的学问。 有人说,找工作那会投了很多很多的份简历,能投的都投了,最后面试机会寥寥无几,如果能有一个机会,我会兴奋的睡不着觉。 如果你和我毕业是一样学校不是985211也没啥背景天赋,那么第一步就是写好简历。好的简历并不是把我有过的工作经历、优点、特长都写上去,重要的是人岗匹配原则,告诉面试官我能干活。 第二步就是要准备好面试腹稿,把

  • ​哈喽大家好,我是chowley 今天我们邀请到了QALog联合创始人,双9硕士给我们做经验分享和学习路线规划,正文如下: 校招生如何准备软件测试、测试开发岗位的面试? 作者介绍 笔者是软件测试方向的硕士研究生。在应届秋招中拿下了20余个软件测试、测试开发的offer。本系列会将我的测试理论体系与大家分享和探讨。 求职建议 大家都很困惑如何学习测试?如何准备测试方面的面试? 我有朋友是做研发的,他

  • 事前准备     新建账号(账户) 如何登入/注销