Bagaimana saya dapat menguji bahwa nilai "lebih besar dari atau sama dengan" di Jasmine?

96

Saya ingin mengonfirmasi bahwa suatu nilai adalah desimal (atau 0), jadi angkanya harus lebih besar dari atau sama dengan nol dan kurang dari 1.

describe('percent',function(){  

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

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

  });

});

Bagaimana cara saya meniru "> = 0"?

Bryce Johnson
sumber
3
Coba:expect(percent).not.toBeLessThan(0);
jcubic
2
Seperti yang disebutkan oleh @Patrizio Rullo dalam jawaban di bawah, pencocoknya telah digabungkan. Sekarang ada pencocokkan toBeGreaterThanOrEqual yang tersedia di Jasmine 2.6: jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
Chris Parton

Jawaban:

109

Saya pikir saya harus memperbarui ini karena API telah berubah di versi Jasmine yang lebih baru. Jasmine API sekarang memiliki fungsi bawaan untuk:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Anda harus menggunakan fungsi-fungsi ini dengan preferensi pada saran di bawah ini.

Klik di sini untuk informasi lebih lanjut tentang Jasmine matchers API


Saya tahu bahwa ini adalah pertanyaan lama dan terpecahkan, tetapi saya perhatikan bahwa solusi yang cukup rapi terlewat. Karena lebih besar dari atau sama dengan adalah kebalikan dari fungsi kurang dari, Coba:

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

Dalam pendekatan ini, nilai persen dapat dikembalikan oleh fungsi async dan diproses sebagai bagian dari aliran kontrol.

Andrew
sumber
4
Jawaban yang satu ini harus diterima. Juga: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Sergei Panfilov
Ini berbahaya, karena expect(NaN).not.toBeLessThan(0);lolos bukannya gagal. ( not.toBeLessThanHanya kebalikan jika Anda berasumsi bahwa itu percentadalah Angka. Jika tidak, itu bukan kebalikannya.)
Kristian Hanekamp
Persis seperti yang ditunjukkan oleh @KristianHanekamp harapan tersebut tidak dapat diandalkan karena juga berlalu ketika nilai 'persen' bukan Angka (NaN).
Rohit
69

Anda hanya perlu menjalankan operasi perbandingan terlebih dahulu, lalu memeriksa apakah itu benar.

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

    var percent = insights.percent;

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

  });   
});
Bryce Johnson
sumber
9
Ini berfungsi, tetapi sayangnya, pesan yang dihasilkan oleh pengujian "> =" yang gagal tidak terlalu ekspresif ("diharapkan salah menjadi kebenaran"). Dan omong-omong, tidak perlu tes menjadi async (ok, hanya nitpicking;).
hashchange
2
@hashchange Dengan plugin seperti jasmine2-custom-message , pesan kesalahan dapat disesuaikan:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex
@TachyonVortex Kedengarannya menarik! Saya tidak tahu tentang hal itu. Untuk perbandingan umum seperti >=, saya lebih suka pencocokan khusus karena itu membuat tes tetap rapi (cukup mudah dilakukan, lihat jawaban saya di bawah), tetapi untuk perbandingan yang muncul lebih jarang, atau tidak cukup ekspresif, plugin itu tampaknya persis hal yang benar. Terima kasih!
hashchange
Bagaimana dengan expect(percent).toBeGreaterThan(-1);xD Saya tidak mencobanya
Cyril CHAPON
15

Versi Jasmine saat ini mendukung toBeGreaterThan dan toBeLessThan.

expect(myVariable).toBeGreaterThan(0);
DrMcCleod
sumber
1
Pertanyaan yang diajukan "lebih besar dari atau sama dengan"
stealththeninja
5

Agak aneh ini bukan fungsi dasar

Anda dapat menambahkan pencocokan khusus seperti ini:

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

Akibatnya Anda mendefinisikan konstruktor untuk matcher Anda - itu adalah fungsi yang mengembalikan objek matcher.

Sertakan itu sebelum Anda 'boot'. Pencocok dasar dimuat pada saat boot.

File html Anda akan terlihat seperti ini:

<!-- 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>

Kemudian di boot.js Anda menambahkan panggilan untuk menambahkan matcher setelah jasmine telah ditentukan tetapi sebelum jasmine.getEnv (). Get env sebenarnya adalah panggilan penyiapan (dengan nama yang agak menyesatkan).

Matcher mendapatkan penyiapan dalam panggilan ke setupCoreMatchers di konstruktor 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();

Mereka menunjukkan cara lain untuk menambahkan pencocokan khusus dalam pengujian sampel, namun cara kerjanya adalah dengan membuat ulang pencocokan sebelum setiap pengujian menggunakan beforeEach. Kelihatannya sangat mengerikan jadi saya pikir saya akan menggunakan pendekatan ini sebagai gantinya.

JonnyRaa
sumber
5

Saya terlambat untuk ini tetapi mempostingnya untuk berjaga-jaga jika seseorang masih mengunjungi pertanyaan ini untuk mencari jawaban, saya menggunakan Jasmine versi 3.0 dan seperti yang disebutkan oleh @Patrizio Rullo Anda dapat menggunakan toBeGreaterThanOrEqual / toBeLessThanOrEqual .

Itu ditambahkan dalam versi 2.5 sesuai catatan rilis - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Misalnya

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

atau

expect(percent).toBeGreaterThanOrEqual(1);
Rohit
sumber
Saya pikir versi jasmine> 2.3.4 tidak menjalankan spesifikasi secara berurutan. Jadi jika mereka menginginkan spesifikasi yang berurutan maka mereka dapat membuat pencocokan khusus tetapi jika mereka setuju dengan spesifikasi yang tidak berurutan maka mereka dapat memilih versi yang disebutkan di atas.
TraxX
4

Saya mengalami masalah yang sama hari ini, dan ternyata, tidak terlalu sulit untuk menambahkan pencocokan khusus untuk itu. Keuntungan utama dari pencocok khusus adalah dapat mengembalikan pesan yang bermakna saat pengujian gagal.

Jadi inilah kode untuk dua pencocok, .toBeAtLeast()dan .toBeAtMost(), jika itu membantu seseorang.

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

  } );

} );
hashchange
sumber
1

Saya merekomendasikan menggunakan pluging Jasmine ini: https://github.com/JamieMason/Jasmine-Matchers

Broda Noel
sumber
Ini berisi pencocokan 'dalam rentang', tetapi bukan pencocokan 'lebih besar atau sama' / 'kurang atau sama', meskipun ...
Vegar
@Vegar, Anda dapat menggunakan ekspektasi (angka) .toBeGreaterThan (angka);
Broda Noel
1

Anda dapat menggunakan fungsi tersebut leastuntuk memeriksa apakah suatu nilai lebih besar dari atau sama dengan beberapa nilai lainnya.

Alias ​​dari leastadalah gte(lebih besar dari atau sama dengan). Sebaliknya, Anda dapat menggunakan lte(kurang dari atau sama dengan) untuk memeriksa kebalikannya.

Jadi, untuk menjawab pertanyaan tersebut, Anda dapat melakukan:

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

Robinson Collado
sumber
Versi Jasmine mana yang Anda gunakan? Saya baru saja meningkatkan dari 2.6.2 ke 2.8 dan saya masih mendapatkan kesalahan TypeError: Cannot read property 'be' of undefineduntukexpect(1).to.be.gte(-1);
Jonathan Parent Lévesque