Как я могу проверить, что значение 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);
DrMcCleod
источник
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. Это кажется довольно ужасным, поэтому я решил использовать этот подход.

JonnyRaa
источник
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

Я рекомендую использовать этот плагин Jasmine: https://github.com/JamieMason/Jasmine-Matchers

Брода Ноэль
источник
Он содержит сопоставление «в диапазоне», но не сопоставление «больше или равно» / «меньше или равно», хотя ...
Вегар
@Vegar, вы можете использовать expect (number) .toBeGreaterThan (number);
Broda Noel
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