Как я могу проверить, что значение Jasmine «больше или равно»?


97

Я хочу подтвердить, что значение является десятичным (или 0), поэтому число должно быть больше или равно нулю и меньше 1.

describe('percent',function(){  

  it('should be a decimal', function() {

    var percent = insights.percent; 
    expect(percent).toBeGreaterThan(0);
    expect(percent).toBeLessThan(1);

  });

});

Как имитировать "> = 0"?



3
Попробуйте:expect(percent).not.toBeLessThan(0);
jcubic

2
Как упоминается @Patrizio Rullo в ответе ниже, его сопоставители были объединены. Теперь в Jasmine 2.6 доступен сопоставитель toBeGreaterThanOrEqual
Крис Партон,

Ответы:


110

Я решил, что мне нужно обновить это, поскольку API изменился в более новых версиях Jasmine. В Jasmine API теперь есть встроенные функции для:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Вы должны использовать эти функции вместо приведенных ниже советов.

Щелкните здесь, чтобы получить дополнительную информацию об API сопоставителей Jasmine.


Я знаю, что это старый и решенный вопрос, но я заметил, что довольно аккуратное решение было упущено. Поскольку функция "больше или равно" обратна функции "меньше", попробуйте:

expect(percent).not.toBeLessThan(0);

В этом подходе значение процента может быть возвращено асинхронной функцией и обработано как часть потока управления.


4
Этот ответ должен быть принят. Кроме того : expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Сергей Панфилов

Это опасно, потому что expect(NaN).not.toBeLessThan(0);проходит, а не терпит неудачу. ( not.toBeLessThanэто только обратное, если вы предположите, что percentэто Число. В противном случае это не обратное.)
Кристиан Ханекамп

Точно, как указано @KristianHanekamp, ​​ожидание не является надежным, поскольку оно также проходит, когда значение «процента» не является числом (NaN).
Rohit

70

Вам просто нужно сначала запустить операцию сравнения, а затем проверить, правда ли она.

describe('percent',function(){
  it('should be a decimal',function(){

    var percent = insights.percent;

    expect(percent >= 0).toBeTruthy();
    expect(percent).toBeLessThan(1);

  });   
});

9
Это работает, но, к сожалению, сообщение, полученное в результате неудачного теста "> =", не особенно выразительно ("ожидается, что ложь будет правдой"). И, кстати, нет необходимости в том, чтобы тест был асинхронным (хорошо, просто придирки;).
hashchange

2
@hashchange С помощью такого плагина, как jasmine2-custom-message , сообщение об ошибке можно настроить:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex,

@TachyonVortex Звучит интересно! Я не знал об этом. Для общих сравнений, например >=, я предпочитаю настраиваемый сопоставитель, потому что он сохраняет тесты незагроможденными (достаточно просто, см. Мой ответ ниже), но для сравнений, которые возникают реже или недостаточно выразительны, этот плагин кажется именно тем правильная вещь. Благодарность!
hashchange

Что насчет expect(percent).toBeGreaterThan(-1);xD Я не пробовал
Кирилл ЧАПОН

15

Текущая версия Jasmine поддерживает toBeGreaterThan и toBeLessThan.

expect(myVariable).toBeGreaterThan(0);

1
Вопрос задан «больше или равно»
stealththeninja

6

Я опаздываю на это, но публикую его на случай, если кто-то все еще посетит этот вопрос в поисках ответов, я использую Jasmine версии 3.0, и, как упоминал @Patrizio Rullo, вы можете использовать toBeGreaterThanOrEqual / toBeLessThanOrEqual .

Он был добавлен в версии 2.5 в соответствии с примечаниями к выпуску - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Например,

expect(percent).toBeGreaterThanOrEqual(1,"This is optional expect failure message");

или

expect(percent).toBeGreaterThanOrEqual(1);

Я думаю, что версия jasmine> 2.3.4 не выполняет спецификации по порядку. Поэтому, если они хотят, чтобы спецификации были упорядочены, они могут создавать собственные сопоставители, но если они в порядке с неупорядоченными спецификациями, они могут выбрать вышеупомянутую версию.
TraxX

5

Как ни странно, это не базовая функциональность

Вы можете добавить настраиваемый сопоставитель следующим образом:

JasmineExtensions.js

yourGlobal.addExtraMatchers = function () {
    var addMatcher = function (name, func) {
        func.name = name;
        jasmine.matchers[name] = func;
    };

    addMatcher("toBeGreaterThanOrEqualTo", function () {
                   return {
                       compare: function (actual, expected) {
                           return {
                               pass: actual >= expected
                           };
                       }
                   };
               }
    );
};

По сути, вы определяете конструктор для своего сопоставителя - это функция, возвращающая объект сопоставления.

Включите это перед "загрузкой". Базовые сопоставители загружаются во время загрузки.

Ваш html-файл должен выглядеть так:

<!-- jasmine test framework-->
<script type="text/javascript" src="lib/jasmine-2.0.0/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-2.0.0/jasmine-html.js"></script>

<!-- custom matchers -->
<script type="text/javascript" src="Tests/JasmineExtensions.js"></script>
<!-- initialisation-->
<script type="text/javascript" src="lib/jasmine-2.0.0/boot.js"></script>

Затем в вашем boot.js добавьте вызов для добавления сопоставителей после определения жасмина, но до jasmine.getEnv (). Get env на самом деле является установочным вызовом (название которого несколько ошибочно).

Сопоставители получают настройку при вызове setupCoreMatchers в конструкторе Env.

/**
 * ## Require &amp; Instantiate
 *
 * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
 */
window.jasmine = jasmineRequire.core(jasmineRequire);
yourGlobal.addExtraMatchers();

/**
 * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
 */
jasmineRequire.html(jasmine);

/**
 * Create the Jasmine environment. This is used to run all specs in a project.
 */
var env = jasmine.getEnv();

Они показывают другой способ добавления настраиваемых сопоставителей в образцы тестов, однако способ его работы заключается в воссоздании сопоставителей перед каждым тестом с использованием файла beforeEach. Это кажется довольно ужасным, поэтому я решил использовать этот подход.


4

Сегодня я столкнулся с той же проблемой, и, как оказалось, нетрудно добавить для нее настраиваемый сопоставитель. Основное преимущество настраиваемого сопоставителя заключается в том, что он может возвращать значимые сообщения, когда тест не проходит.

Итак, вот код для двух сопоставителей, .toBeAtLeast()и .toBeAtMost(), если он кому-то поможет.

beforeEach( function () {

  // When beforeEach is called outside of a `describe` scope, the matchers are
  // available globally. See http://stackoverflow.com/a/11942151/508355

  jasmine.addMatchers( {

    toBeAtLeast: function () {
      return {
        compare: function ( actual, expected ) {
          var result = {};
          result.pass = actual >= expected;
          if ( result.pass ) {
            result.message = "Expected " + actual + " to be less than " + expected;
          } else {
            result.message = "Expected " + actual + " to be at least " + expected;
          }
          return result;
        }
      };
    },

    toBeAtMost: function () {
      return {
        compare: function ( actual, expected ) {
          var result = {};
          result.pass = actual <= expected;
          if ( result.pass ) {
            result.message = "Expected " + actual + " to be greater than " + expected;
          } else {
            result.message = "Expected " + actual + " to be at most " + expected;
          }
          return result;
        }
      };
    }

  } );

} );

4

Он был просто объединен с моим патчем в основной ветке Jasmine GitHub, чтобы добавить нужные вам сопоставления:

Добавить сопоставители toBeGreatThanOrEqual и toBeLessThanOrEqual

Но я понятия не имею, в каком именно выпуске это будет. А пока вы можете попробовать использовать код моего коммита в своей локальной копии Jasmine.


Он был объединен в выпуске 2.5.0 github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md
Патрицио Рулло


1

Вы можете использовать эту функцию, leastчтобы проверить, больше ли какое-либо значение или равно ему.

Псевдоним leastis gte(больше или равно). И наоборот, вы можете использовать lte(меньше или равно), чтобы проверить обратное.

Итак, чтобы ответить на вопрос, вы можете:

expect(percent).to.be.gte(0)


Какую версию Жасмин вы используете? Я просто обновление с 2.6.2 до 2.8 , и я все еще получаю ошибку TypeError: Cannot read property 'be' of undefinedзаexpect(1).to.be.gte(-1);
Джонатан Родитель Lévesque
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.