怎么修; “ if-else”语句跳过“ if”部分,而直接转到“ else if”部分?

时间:2019-01-15 12:25:07

标签: javascript cypress

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

但是问题是;它以“驱动程序”角色登录,并同时检查“ rides.title”和“ chauffeurs.title”。由于“驾驶员”角色不包含“ 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"
  }
}

3 个答案:

答案 0 :(得分:0)

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

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

它的基本含义是“用户角色是'dispatcher'还是true或true”,并且可以缩写为“ true”。这是因为任何非空字符串在js中总是“真实的”。

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

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

或者最好是这样:

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

答案 1 :(得分:0)

您不应该测试

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

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

因为user[role]是灯具对象。

您应该测试

if (role === "driver")

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

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

答案 2 :(得分:0)

感谢您的评论!我已经通过定义另一个const来存储该问题的方法来解决此问题,该const用来存储从另一页获得的用户实际角色的值,然后将其用作条件。