ฉันจะทดสอบว่าค่า“ มากกว่าหรือเท่ากับ” ในจัสมินได้อย่างไร


100

ฉันต้องการยืนยันว่าค่าเป็นทศนิยม (หรือ 0) ดังนั้นตัวเลขควรมากกว่าหรือเท่ากับศูนย์และน้อยกว่า 1

describe('percent',function(){  

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

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

  });

});

ฉันจะเลียนแบบ "> = 0" ได้อย่างไร


อาจจะเกี่ยวข้อง: การตรวจสอบสองเขตแดนกับจัสมิน (ระหว่างการจับคู่)
alecxe

3
ลอง:expect(percent).not.toBeLessThan(0);
jcubic

2
ดังที่ @Patrizio Rullo ได้กล่าวไว้ในคำตอบด้านล่างตัวจับคู่ของเขาได้ถูกรวมเข้าด้วยกันตอนนี้มีตัวจับคู่ toBeGreaterThanOrEqual อยู่ใน Jasmine 2.6: jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
Chris Parton

คำตอบ:


113

ฉันคิดว่าฉันควรอัปเดตสิ่งนี้เนื่องจากมีการเปลี่ยนแปลง API ใน Jasmine เวอร์ชันใหม่กว่า ขณะนี้ Jasmine API ได้สร้างฟังก์ชันสำหรับ:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

คุณควรใช้ฟังก์ชันเหล่านี้ตามคำแนะนำด้านล่าง

คลิกที่นี่เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ Jasmine matchers API


ฉันรู้ว่านี่เป็นคำถามเก่าและมีการแก้ไข แต่ฉันสังเกตเห็นว่าพลาดวิธีแก้ปัญหาที่ค่อนข้างเรียบร้อย เนื่องจากมากกว่าหรือเท่ากับเป็นค่าผกผันของฟังก์ชัน less than ให้ลอง:

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

ในแนวทางนี้ค่าของเปอร์เซ็นต์สามารถส่งกลับโดยฟังก์ชัน async และประมวลผลเป็นส่วนหนึ่งของโฟลว์การควบคุม


5
อันนี้ควรได้รับคำตอบ นอกจากนี้: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Sergei Panfilov

สิ่งนี้อันตรายเพราะการexpect(NaN).not.toBeLessThan(0);ผ่านแทนที่จะล้มเหลว ( not.toBeLessThanเป็นเพียงค่าผกผันถ้าคุณสมมติว่าpercentเป็นตัวเลขไม่เช่นนั้นจะไม่ใช่ค่าผกผัน)
Kristian Hanekamp

ตรงตามที่ @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
สิ่งนี้ใช้ได้ผล แต่น่าเสียดายที่ข้อความที่เกิดจากการทดสอบล้มเหลว "> =" ไม่ได้แสดงออกโดยเฉพาะอย่างยิ่ง ("คาดว่าเท็จจะเป็นจริง") และอย่างไรก็ตามไม่จำเป็นต้องให้การทดสอบเป็น async (ตกลงเพียง nitpicking;)
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 ฉันไม่ได้ลอง
Cyril CHAPON

15

Jasmine เวอร์ชันปัจจุบันรองรับ toBeGreaterThan และ toBeLessThan

expect(myVariable).toBeGreaterThan(0);

1
คำถามที่ถามว่า "มากกว่าหรือเท่ากับ"
stealththeninja

6

ฉันสายนี้ แต่โพสต์ไว้ในกรณีที่ผู้เข้าชมบางส่วนหนึ่งยังคงเป็นคำถามนี้มองหาคำตอบผมใช้จัสมินรุ่น 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

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 matchers

แต่ฉันไม่รู้ว่ามันจะเป็นรุ่นไหน ในระหว่างนี้คุณสามารถลองใช้รหัสการกระทำของฉันในสำเนา Jasmine ในพื้นที่ของคุณ


มันถูกรวมเข้าในรีลีส 2.5.0 github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md
Patrizio Rullo

1

ฉันแนะนำให้ใช้การเสียบจัสมินนี้: https://github.com/JamieMason/Jasmine-Matchers


มันมีตัวจับคู่แบบ 'อยู่ในช่วง' แต่ไม่มีตัวจับคู่ 'มากกว่าหรือเท่ากัน' / 'น้อยกว่าหรือเท่ากัน' แม้ว่า ...
Vegar

@ 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);
Jonathan Parent Lévesque
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.