【问题标题】:Switch statement is returning no valueSwitch 语句没有返回值
【发布时间】:2015-09-24 13:41:53
【问题描述】:

我正在编写一个测试,它读取一个字符串,然后获取该字符串并将其应用于 switch 语句。然后我将字符串与大小写匹配并设置一个整数值,我将其传递回规范页面,然后将 int 值传递给我用于 if 语句的另一个测试。我无法让 int 通过,因此 if 语句将无法正常工作。

开关对象:

var appsNotPurchased = 0;
this.checksHomeSublevel = function(mmCode) {
    browser.get('https://iplan-qa.meetingmatrix.com/Home/Index/' + mmCode);
    marketingObjects.level.getText().then(function(text) {
      var homeText = text;
      browser.get('https://iplan-qa.meetingmatrix.com/Home/Apps/' + mmCode);
      expect($('div.apps-subscription > span').getText()).toEqual('iPlan Level: ' + homeText);
      switch (homeText) {
        case 'Select':
          console.log(homeText);
          appsNotPurchased = 6;
          return appsNotPurchased;
          break;
        case 'Content':
          console.log(homeText);
          appsNotPurchased = 0 || 1 || 2 || 3 || 4 || 5 || 6;
          return appsNotPurchased;
          break;
      }


    });

testSpec 描述函数:

describe('should upload media: ', function() {

  it('should select add media', function() {
    var mmCode = "ACC0572";
    var appsNotPurchased = appsObjects.checksHomeSublevel(mmCode);
    appsObjects.checksSubLevelSelect(mmCode, appsNotPurchased);
  });

});

我将值传递给的对象:

    this.checksSubLevelSelect = function(mmCode, appsNotPurchased) {

      //counts the apps
      apps.count().then(function(count) {
        expect(count).toEqual(7);
        for (var i = 0; i < count; i++) {
          if (appsPlace == appsNotPurchased) {
            //does something here
          } else {
            //does something here
          }
          appsPlace++;
        }
      });
    };

【问题讨论】:

  • 我建议在你的代码中使用更多的空白,这样会更容易阅读(至少对我来说:-)
  • 你应该在你的return语句之后添加一个default: return 'None of the above'; case并删除break;语句(return无论如何都会break它)。如果它返回上面的那句话,您就知道您的案例不匹配。提示:总是default 提供给switch 语句。
  • homeText 总是“选择”还是“内容”?由于您没有默认返回值。 appsNotPurchased = 0 || 1 || 2 || 3 || 4 || 5 || 6; 正确吗?因为它总是 1,所以它是第一个真值。
  • @NicolePhillips:Shilly 所说的第二部分是0 || 1 || 2 || 3 || 4 || 5 || 6 只是写1 的一种非常长且不清楚的方式。该值将始终为1。里面没有任何条件。
  • @NicolePhillips 这不是它的工作原理。 || 或运算符将返回第一个不是falsy 的值,因此是数字1

标签: javascript angularjs selenium-webdriver switch-statement protractor


【解决方案1】:

您应该返回一个对象而不是 || 语句。 return 语句也应该写在 switch 外面而不是里面。

  • 最简单的解决方案是使用一个全局变量appsNotPurchased 来存储值,然后您可以在测试规范中使用它而无需返回。但这将是一个糟糕的编码标准。
  • 第二种解决方案是在量角器异步执行时返回函数的承诺。

这是第二种解决方案的示例 -

this.checksHomeSublevel = function(mmCode) {
    var getval = marketingObjects.level.getText().then(function(text) {
        switch (homeText) {
          case 'Select':
            console.log(homeText);
            appsNotPurchased = [6];
            break;
          case 'Content':
            console.log(homeText);
            appsNotPurchased = [0, 1, 2, 3, 4, 5, 6]; //either use array or object
            break;
          default:
            console.log("Default");
        }
        return appsNotPurchased;
    });
    return protractor.promise.fulfilled(getval);
};

然后在你的规范中像承诺一样使用它 -

appsObjects.checksHomeSublevel(mmCode).then(function(appsNotPurchased){
    appsObjects.checksSubLevelSelect(mmCode, appsNotPurchased);
});

现在在你的函数中使用上面的结果 -

   this.checksSubLevelSelect = function(mmCode, appsNotPurchased) {

      //counts the apps
      apps.count().then(function(count) {
        expect(count).toEqual(7);
        for (var i = 0; i < count; i++) {
          if (appsPlace == appsNotPurchased[i]) {
            //does something here
          } else {
            //does something here
          }
          appsPlace++;
        }
      });
    };

希望对你有帮助。

【讨论】:

  • 实际上,return 语句可以在您的 switch 中,因为它将充当switchbreak,并且也会立即结束封装函数。
  • True @somethinghere 但它不是一个好习惯。此外,如果在 switch 语句之后需要执行某些操作。
  • 是的,它会跳过它之后的任何内容,但在这种非常特殊的情况下,我会说不将任何内容分配给像appsNotPurchased 这样的变量并简单地返回值会更具可读性。我觉得这更清楚:return [0, 1, 2, 3, 4, 5, 6];。而且我会说这不是坏习惯,甚至可能是一个好习惯,具体取决于用例(只要 every casereturns )。
  • @Girish 这些都不适合我。我创建了一个全局数组变量并更改为一个数组并停止返回,这很有效。我得到的下一个答案是'无法读取未定义的属性'then'
  • @NicolePhillips,更新了代码以正确方式返回承诺,还更新了全局变量部分,这是人们能想到的最简单的解决方案。让我知道您是否仍然收到承诺错误。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多