Як я можу перевірити, чи є значення у Жасмині „більшим або рівним“?


96

Я хочу підтвердити, що значення є десятковою (або 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
Кріс Партон

Відповіді:


109

Я вирішив, що повинен оновити це, оскільки API змінився в нових версіях Jasmine. Зараз API Jasmine має вбудовані функції для:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Ви повинні користуватися цими функціями, передуючи порадам нижче.

Клацніть тут, щоб отримати додаткову інформацію про API збору жасмину


Я знаю, що це давнє і вирішене питання, але я помітив, що досить акуратне рішення було пропущено. Оскільки більше або дорівнює оберненому до функції менше, спробуйте:

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).
Рохіт,

69

Потрібно спочатку запустити операцію порівняння, а потім перевірити, чи це неправдиво.

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, я не спробував
Кирило ШАПОН


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. Це здається досить жахливим, тому я подумав, що замість цього піду на такий підхід.


5

Я запізнююсь із цим, але публікую його на той випадок, якщо хтось все-таки відвідає це запитання, шукаючи відповіді, я використовую 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);

Я думаю, що версія жасмину> 2.3.4 не виконує специфікації в порядку. Отже, якщо вони хочуть специфікації в порядку, то вони можуть створювати власні збіги, але якщо у них все в порядку з невпорядкованими специфікаціями, вони можуть вибрати вищезгадану версію.
TraxX

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, мій патч, щоб додати потрібні збіги:

Додайте збіги доBeGreatThanOrEqual та toBeLessThanOrEqual

Але я не уявляю, в якому випуску це буде. Тим часом ви можете спробувати використати код мого коміту у вашій локальній копії Jasmine.


Його було об’єднано у випуску 2.5.0 github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md
Patrizio


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.