【问题标题】:Jasmine expect logic (expect A OR B)Jasmine 期望逻辑(期望 A OR B)
【发布时间】:2012-11-11 21:27:49
【问题描述】:

如果满足两个期望之一,我需要将测试设置为成功:

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number));
expect(mySpy.mostRecentCall.args[0]).toEqual(false);

我希望它看起来像这样:

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)).or.toEqual(false);

我在文档中遗漏了什么还是我必须编写自己的匹配器?

【问题讨论】:

  • 我检查了文档并尝试了一些代码,但我认为我们不能“轻松”地做到这一点,抱歉。但根据我的发现,您可以创建自己的“可链接”匹配器。

标签: javascript unit-testing logic jasmine


【解决方案1】:

将多个可比较的字符串添加到一个数组中,然后进行比较。颠倒比较顺序。

expect(["New", "In Progress"]).toContain(Status);

【讨论】:

  • 好主意,非常简洁!并提供比expect( Status == "New" || Status == "In Progress").toBe(true); 更清晰的错误消息
  • 想知道为什么这不是选定的答案?这是测试两个期望之一的最简单的解决方案。
  • 聪明的想法和易于阅读的实现。效果很好!
【解决方案2】:

这是一个老问题,但如果有人还在寻找我还有另一个答案。

如何构建逻辑 OR 表达式并期待它?像这样:

var argIsANumber = !isNaN(mySpy.mostRecentCall.args[0]);
var argIsBooleanFalse = (mySpy.mostRecentCall.args[0] === false);

expect( argIsANumber || argIsBooleanFalse ).toBe(true);

这样,您可以显式地测试/预期 OR 条件,您只需要使用 Jasmine 来测试布尔匹配/不匹配。将在 Jasmine 1 或 Jasmine 2 中工作:)

【讨论】:

  • 为我做得很好
【解决方案3】:

注意:此解决方案包含 Jasmine v2.0 之前版本的语法。 有关自定义匹配器的更多信息,请参阅:https://jasmine.github.io/2.0/custom_matcher.html


Matchers.js 仅适用于单个“结果修饰符” - not:

核心/Spec.js:

jasmine.Spec.prototype.expect = function(actual) {
  var positive = new (this.getMatchersClass_())(this.env, actual, this);
  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
  return positive;

core/Matchers.js:

jasmine.Matchers = function(env, actual, spec, opt_isNot) {
  ...
  this.isNot = opt_isNot || false;
}
...
jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
  return function() {
    ...
    if (this.isNot) {
      result = !result;
    }
  }
}

所以看起来您确实需要编写自己的匹配器(从beforeit 块中正确的this)。例如:

this.addMatchers({
   toBeAnyOf: function(expecteds) {
      var result = false;
      for (var i = 0, l = expecteds.length; i < l; i++) {
        if (this.actual === expecteds[i]) {
          result = true;
          break;
        }
      }
      return result;
   }
});

【讨论】:

  • 我所需要的只是'没有多重匹配',这个答案还有很多! :) 感谢您的代码。我认为它不能处理jasmine.any(Number) 的情况,但我可以解决。如果您不介意,我会在您弄清楚后将其放入您的答案中。
【解决方案4】:

您可以将比较从 expect 语句中取出,以充分利用比较运算符。

let expectResult = (typeof(await varA) == "number" || typeof(await varA) == "object" );
expect (expectResult).toBe(true);

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 2014-01-23
    • 2014-11-06
    • 1970-01-01
    • 2020-06-09
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多