【问题标题】:How to fix; "if-else" statement skips the "if" part and directly goes to the "else if" part?怎么修; “if-else”语句跳过“if”部分,直接进入“else if”部分?
【发布时间】:2019-01-15 12:25:06
【问题描述】:

我需要使用 5 个不同的角色登录,并检查他们是否有正确的选项卡来根据他们的角色进行导航。

但问题是;它以“司机”角色登录并检查“rides.title”和“chauffeurs.title”。由于 'driver' 角色不包含“chauffeurs.title”,因此测试失败。

跳过“if”部分,直接进入“else if”部分。

我尝试了什么:

我尝试测试我的循环是否运行良好,显然它运行良好。

我删除了整个 if 块并粘贴了下面的代码,看到它以每个角色一个接一个地登录并检查了“rides.title”。

.visit('/planned')
          .get('[data-qa="rides.title"')
          .should('exist')
          .get('[data-qa="logout"]')
          .click()

最后一个角色除外;因为它没有“rides.title”,这很好。

这是完整的代码,用于查看并获取有关我目前所做工作的更多信息:

const roles = ["driver", "dispatcher", "provider", "reviewer", "admin"];

it("Navigation items for a single permission", () => {
  cy.fixture("users.json").then(users => {
    const user = users[Cypress.env("ENVIRONMENT")];
    roles.forEach(role => {
      cy.login(user[role], Cypress.env("DEFAULT_USER_PASSWORD")).then(
        response => {
          cy.setCookie("__bl_pp__", response.body.result.access_token);
          if (user[role] === "driver") {
            cy.visit("/planned")
              .get('[data-qa="rides.title"')
              .should("exist")
              .get('[data-qa="logout"]')
              .click();
          } else if (["dispatcher", "provider", "reviewer"].includes(user[role])) {
            cy.visit("/planned")
              .get('[data-qa="rides.title"')
              .should("exist")
              .get('[data-qa="chauffeurs.title"')
              .should("exist")
              .get('[data-qa="logout"]')
              .click();
          } else {
            cy.visit("/planned")
              .get('[data-qa="chauffeurs.title"')
              .should("exist")
              .get('[data-qa="logout"]')
              .click();
          }
        })
      })
    })
  })
})

预期的情况应该是;测试应该使用 5 个不同的角色登录并验证可用的选项卡,如上面的代码中所述。

Role        Navigation Tabs
Driver      Rides
Dispatcher  Rides, Chauffeurs
Provider    Rides, Chauffeurs
Reviewer    Rides, Chauffeurs
Admin       Chauffeurs

提前致谢!

这是我的 users.json 文件:

{
  "development": 
  {
    "driver": "aa+driver@b.com",
    "dispatcher": "bb+dispatcher@b.com",
    "provider": "cc+provider@b.com",
    "reviewer": "dd+reviewer@b.com",
    "admin": "ee+admin@b.com"
  }
}

【问题讨论】:

  • (user[role] === 'dispatcher' || 'provider' || 'reviewer')始终是真实的,因为 'provider' 是真实的。
  • 为了澄清 Xufox 的评论,如果角色不是“调度员”,那么 (user[role] === 'dispatcher' || 'provider' || 'reviewer') 将评估为 (false || true || true),然后当然将评估为 true。你所做的并不是你如何编写一个 if 语句来测试多个值,你必须在每个子句中重述参数的每一侧,即(user[role] === 'dispatcher' || user[role] === 'provider' || user[role] === 'reviewer')||s 中的每一位都是单独评估的……它不是选项列表。我建议你回顾一下你对 JS 语法的理解。
  • Concise way to compare against multiple values 的可能重复项。 includes 方法目前是最佳实践。
  • user[role] 应该是什么?似乎您正在尝试获得类似 user.dispatcher 的内容,但是……然后您也将其与字符串“dispatcher”进行了比较。似乎您要么需要检查 user.role 这是该块顶部的字符串之一,要么您有 user.dispatcher = trueuser.driver = trueuser.provider = false 等。或者完全是其他的东西。基本上,我认为user[role] 是不正确的。
  • @ZiyaI.Erogul 但user[role] 将检查每个对象的user.dispatcheruser.driver属性。拥有user.dispatcher = "dispatcher" 似乎很奇怪,因为当你执行user[role] === "dispatcher" 时,你会检查它是否已设置。这真的是您的 user 对象所拥有的吗?还是您设置了(更合乎逻辑的)属性user.role = "dispatcher" 或类似user.dispatcher = true 的东西?两者都是正常的,但就目前而言,您预计这两种方法会有一些非正统的混合。

标签: javascript cypress


【解决方案1】:

你不应该测试

if (user[role] === "driver")

if (["dispatcher", "provider", "reviewer"].includes(user[role]))

因为user[role] 是fixture 对象。

你应该测试

if (role === "driver")

if (["dispatcher", "provider", "reviewer"].includes(role))

不确定这是否能解决所有问题,但这显然是第一步。

【讨论】:

    【解决方案2】:

    这里的问题在于 if 条件语句。这不是您想要实现的正确语法:

    if(user[role] === "dispatcher" || "provider" || "reviewer") {
       ...
    }
    

    它的基本意思是“如果用户角色是'dispatcher'或true或true”,可以缩写为“true”。这是因为任何非空字符串在 js 中总是 'truthy'。

    您需要对每个“或”组重复比较,如下所示:

    if(user[role] === "dispatcher" || user[role] === "provider" || user[role] === "reviewer") {
       ...
    }
    

    或者最好是这样:

    if(["dispatcher", "provider", "reviewer"].includes(user[role])) {
       ...
    }
    

    【讨论】:

    • 我应用了您的建议@Marcin,但我仍然收到以下错误:预计 [data-qa="chauffeurs.title" 存在于 DOM 中。它正在跳过第一个“如果”。
    • @ZiyaI.Erogul 如果您向我们展示user 变量内容的示例,将会有很大帮助。请将其编辑到您的问题中...谢谢。
    【解决方案3】:

    感谢您的 cmets!我已经通过定义另一个常量来存储我从另一个页面获得的用户实际角色的值来解决这个问题,然后我将其用作条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 2019-04-09
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 2013-04-19
      相关资源
      最近更新 更多