Cypress中调用pre-created-user fixture时数据undefined问题求助
问题原因及解决办法
你遇到的preCreatedUser.email返回undefined的核心原因是fixture的JSON结构是嵌套的,而你直接把整个fixture对象赋值给了preCreatedUser变量。
看你的pre-created-user.json结构:
{ "preCreatedUser": { "email": "test@test.app", "password": "password", "phone": "test", "documentId": "test", "firstName": "test", "lastName": "test", "citizenship": "test", "dateOfBirth": "test", "address": "test" } }
当你通过cy.fixture加载这个文件时,拿到的u是包含外层preCreatedUser键的完整对象——也就是说,u.preCreatedUser才是你要的用户数据,你直接把u赋值给preCreatedUser,自然找不到preCreatedUser.email这个属性。
解决办法(选一种即可)
方法1:修改fixture赋值逻辑
在then回调里直接取出内层的用户对象赋值:
before(() => cy.fixture('pre-created-user').then((u) => (preCreatedUser = u.preCreatedUser)));
如果要保留类型定义,要么调整User类型对应内层用户结构,要么新增一个匹配整个fixture结构的类型:
interface FixtureWrapper { preCreatedUser: User; } before(() => cy.fixture('pre-created-user').then((u: FixtureWrapper) => (preCreatedUser = u.preCreatedUser)));
方法2:简化fixture文件结构
如果不需要外层的preCreatedUser键,直接把用户对象作为JSON根节点:
{ "email": "test@test.app", "password": "password", "phone": "test", "documentId": "test", "firstName": "test", "lastName": "test", "citizenship": "test", "dateOfBirth": "test", "address": "test" }
这样你原来的赋值代码就能正常工作,preCreatedUser.email可以直接取到值。
方法3:调整后续取值方式(不推荐)
如果不想改代码和fixture,后续使用时多嵌套一层:
console.log(preCreatedUser.preCreatedUser.email); LogInPage.logIn(preCreatedUser.preCreatedUser.email, preCreatedUser.preCreatedUser.password); UserProfile.emailInputValue.then((c) => c.trim()).should('eq', preCreatedUser.preCreatedUser.email);
但这种写法冗余,不如前两种方法简洁。
内容的提问来源于stack exchange,提问作者bobby bobby
相关产品推荐
相关产品推荐

