如何使用 cy.intercept() 使用不同的存根存根两个请求?

Posted

技术标签:

【中文标题】如何使用 cy.intercept() 使用不同的存根存根两个请求?【英文标题】:how to stub two requests with differents stubs using cy.intercept()? 【发布时间】:2022-01-15 17:45:45 【问题描述】:

我正在尝试使用两个具有不同响应的 cy.intercept 函数来存根相同的 http GET 请求。我尝试这样做的一种方法是使用条件 if 语句。在 if 语句中,我将调用 cy.intercept 函数。我使用布尔变量作为条件。问题是布尔变量不会根据测试场景而改变(我正在使用带有 cypress-cucumber-preprocessor 的 cypress)。如何实现我的测试文件,使其根据测试将条件定义为真或假,从而动态定义不同的 cy.intercept 响应?

我的测试文件:

 let isValid = false

 Given('I am on the "user-login" page', () => 
     cy.log(isValid)
     cy.visit("http://localhost:8080/user-login")
     cy.title().should('eq',"User Login Page")
     isValid = true
     cy.log(isValid)
 )

 Given('I am on the "user-login" page', () => 
     cy.log(isValid)
     cy.visit("http://localhost:8080/user-login")
     cy.title().should('eq',"User Login Page")

     isValid = false
     cy.log(isValid)
 )

 When('I enter "George312"', () => 
     
     cy.get('input[type="text"]').should("be.visible").type("George312")
 )

 When('I enter "George312"', () => 
     cy.get('input[type="text"]').should("be.visible").type("George312")
 )


 And('I enter "hsj%2*sc5$"', () => 

     cy.get('input[type="password"]').should("be.visible").type("hsj%2*sc5$")   
 )

 And('I enter "hsj%2*sc5$3"', () => 

     cy.get('input[type="password"]').should("be.visible").type("hsj%2*sc5$3")   
 )


 And('I Click the "Submit" button', () => 
     if(isValid === true)
         cy.intercept('api/users',
         
             "body":  "isAuthenticated": true
         
       ).as("loginUser")
     
     
     cy.get('button[id="LoginBtn"]').should('be.visible').click()
     cy.wait(2000)
     cy.wait("@loginUser")
 )


 And('I Click the "Submit" button', () => 
     isValid = false
     if(isValid === false)
         cy.intercept('api/users',
         
             "body":  "isAuthenticated": false
         
       ).as("loginUser")
     
     cy.get('button[id="LoginBtn"]').should('be.visible').click()
     cy.wait(2000)
     cy.wait("@loginUser")
 )


 Then('I should see written in a window user "George312 is now logged in!"', () => 

     cy.get("p").contains('user "George312 is now logged in!"').should("be.visible")


 )

 Then('I should see written in a window user "Login Failed! wrong password"', () => 

     cy.get("modal").contains("Login Failed! wrong password").should("be.visible")
 )

cy.log() 类似于 console.log()。我在我的代码中用红色标出了四个 cy.log() 调用的输出。输出不使森 这是柏树的输出:

cy.log() 类似于 console.log()。我在我的代码中用红色标出了四个 cy.log() 调用的输出。输出没有意义。就好像变量被设置为 true 并且之后永远不会改变。

【问题讨论】:

【参考方案1】:

我找到了解决方案。 我要声明的变量必须以这种方式声明: this.isValid 因此可以在文件中的其他位置访问它。 其次: Given() 语句应该彼此不同。否则,两者都会在两种情况下都被激活,导致变量值在上次初始化时被覆盖。

这样:

Given(/^I am on the "user-login" 1 page$/, () => 
    cy.visit("http://localhost:8080/user-login")
    cy.title().should('eq',"User Login Page")
    this.isValid = true
    cy.log(this.isValid)
)
Given(/^I am on the "user-login" page$/, () => 
    cy.log(this.isValid)
    cy.visit("http://localhost:8080/user-login")
    cy.title().should('eq',"User Login Page")

    this.isValid = false
    cy.log(this.isValid)
)

然后 cypress 的输出变成这样:

【讨论】:

以上是关于如何使用 cy.intercept() 使用不同的存根存根两个请求?的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯版本更新后标头授权不起作用

赛普拉斯:拦截一条不存在的路线

当文件缓存在磁盘上时,赛普拉斯拦截不起作用

如何使用组合布局为不同部分设置不同的背景?

如何使用CSV数据集配置在Jmeter的不同线程中使用不同输入登录多个用户

为不同的设备/分辨率使用不同的图像,例如如何使用波浪号 (~) 来区分 iPhone 和 iPad?