Cypress中使用this.*访问fixture别名时报无法读取SOAP_body属性的错误
问题根源
你遇到的报错是this本身为undefined导致的,和fixture加载、自定义task逻辑无关,核心原因是违反了Cypress/Mocha对this上下文绑定的规则:
- 当你需要用
this.*访问别名时,所有关联的回调(包括describe、beforeEach、it)都必须使用传统函数表达式,不能用箭头函数。 - 箭头函数会继承外层词法作用域的
this,无法被Cypress/Mocha绑定到正确的测试上下文对象,最终导致访问this.SOAP_body时,this本身已经是undefined。
对照你的代码来看:
describe("SOAP API Test", () => { ... })用了箭头函数beforeEach(() => { ... })用了箭头函数- 只有
it的回调用了普通函数,完全不符合绑定要求。
修正方案
把所有涉及this上下文的回调改成传统函数表达式即可:
/// <reference types="cypress"/> describe("SOAP API Test", function () { // 改为普通函数 beforeEach(function () { // 改为普通函数 cy.fixture("SOAP_body.xml").as("SOAP_body"); }); it("Test with task", function () { const body = this.SOAP_body; // 此时this已正确绑定,可正常获取fixture值 cy.request({ method: "POST", headers: { "content-type": "text/xml; charset=utf-8", Authorization: "Token myVerySecretToken", SOAPAction: "http://tempuri.org/TrackingFull", }, url: `https://path.of/the/application.asmx`, body: body, failOnStatusCode: false, }).then((result) => { expect(result.status).to.equal(200); cy.task("XMLtoJSON", result.body).then((response) => { expect( response.elements[0].elements[1].elements[0].elements[0] .elements[1].elements[0].elements[0].elements[0] .elements[0].elements[0].text ).to.equal("something"); }); }); }); });
补充说明
cy.get('@别名')方式可以正常运行,是因为它直接从Cypress内部维护的别名存储取值,完全不依赖this的绑定。- 只要你选择用
this.*访问别名,所有对应的describe、hook、it回调都不能用箭头函数,哪怕只有一个环节用了箭头函数,都可能导致this绑定异常。
内容的提问来源于stack exchange,提问作者As Aves
相关产品推荐
相关产品推荐

