Подтвердить что ты не робот

Жасмин ожидает логики (ожидают A OR B)

Мне нужно, чтобы тест прошел успешно, если выполнено одно из двух ожиданий:

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);

Есть ли что-нибудь, что я пропустил в документах, или мне нужно написать свой собственный помощник?

4b9b3361

Ответ 1

Примечание. Это решение содержит синтаксис для версий до 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;

ядро ​​/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;
    }
  }
}

Итак, похоже, вам действительно нужно написать свой собственный матчи (изнутри блока before или it для правильного 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;
   }
});

Ответ 2

Добавьте несколько сопоставимых строк в массив, а затем сравните. Отмените порядок сравнения.

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

Ответ 3

Это старый вопрос, но если кто-то все еще смотрит, у меня есть другой ответ.

Как построить логическое выражение OR и просто ожидать этого? Вот так:

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

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

Таким образом, вы можете явно проверить/ожидать условие OR, и вам просто нужно использовать Jasmine для проверки логического соответствия/несоответствия. Будет работать в Жасмин 1 или Жасмин 2:)