Làm cách nào để tôi có thể kiểm tra rằng một giá trị là “lớn hơn hoặc bằng” trong Jasmine?


94

Tôi muốn xác nhận rằng một giá trị là số thập phân (hoặc 0), do đó, số phải lớn hơn hoặc bằng 0 nhỏ hơn 1.

describe('percent',function(){  

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

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

  });

});

Làm cách nào để bắt chước "> = 0"?



3
Hãy thử:expect(percent).not.toBeLessThan(0);
jcubic

2
Như đã được @Patrizio Rullo đề cập trong một câu trả lời bên dưới, các đối tác của anh ấy đã được hợp nhất. Hiện đã có một đối sánh toBeGreaterThanOrEqual trong Jasmine 2.6: jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
Chris Parton

Câu trả lời:


108

Tôi nghĩ rằng tôi nên cập nhật điều này vì API đã thay đổi trong các phiên bản mới hơn của Jasmine. API Jasmine hiện đã tích hợp sẵn các chức năng cho:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Bạn nên sử dụng các chức năng này theo lời khuyên bên dưới.

Nhấp vào đây để biết thêm thông tin về API Jasmine matchers


Tôi biết rằng đây là một câu hỏi cũ và đã được giải quyết, nhưng tôi nhận thấy rằng một giải pháp khá gọn gàng đã bị bỏ qua. Vì lớn hơn hoặc bằng là nghịch đảo của hàm nhỏ hơn, Hãy thử:

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

Trong cách tiếp cận này, giá trị của phần trăm có thể được trả về bởi một hàm không đồng bộ và được xử lý như một phần của luồng điều khiển.


4
Câu trả lời này nên được chấp nhận. Ngoài ra: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Sergei Panfilov

Điều này là nguy hiểm, bởi vì expect(NaN).not.toBeLessThan(0);vượt qua thay vì thất bại. ( not.toBeLessThanchỉ là nghịch đảo nếu bạn cho rằng đó percentlà một Số. Nếu không, nó không phải là nghịch đảo.)
Kristian Hanekamp

Chính xác như được chỉ ra bởi @KristianHanekamp, ​​kỳ vọng không đáng tin cậy vì nó cũng vượt qua khi giá trị của 'phần trăm' không phải là Số (NaN).
Rohit

69

Bạn chỉ cần chạy thao tác so sánh trước và sau đó kiểm tra xem nó có trung thực không.

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

    var percent = insights.percent;

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

  });   
});

9
Điều này hoạt động, nhưng rất tiếc, thông điệp được tạo ra bởi một bài kiểm tra "> =" không đạt không phải là đặc biệt biểu đạt ("dự kiến ​​sai thành sự thật"). Và nhân tiện, không cần phải kiểm tra không đồng bộ (ok, chỉ cần nitpicking;).
hashchange

2
@hashchange Với plug-in như jasmine2-tùy chỉnh thông điệp , thông báo lỗi có thể được tùy chỉnh:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex

@TachyonVortex Nghe thật thú vị! Tôi không biết về điều đó. Đối với các phép so sánh phổ biến như >=, tôi thích một trình so khớp tùy chỉnh vì nó giữ cho các bài kiểm tra không gọn gàng (đủ dễ thực hiện, hãy xem câu trả lời của tôi bên dưới), nhưng đối với các so sánh ít xuất hiện hơn hoặc không đủ biểu cảm, plugin đó dường như chính xác là điều đúng. Cảm ơn!
hashchange vào

Còn expect(percent).toBeGreaterThan(-1);xD thì sao, tôi đã không thử nó
Cyril CHAPON 10/09/15

15

Phiên bản hiện tại của Jasmine hỗ trợ toBeGreaterThan và toBeLessThan.

expect(myVariable).toBeGreaterThan(0);

1
Câu hỏi được hỏi "lớn hơn hoặc bằng"
stealththeninja

5

Hơi kỳ lạ đây không phải là chức năng cơ bản

Bạn có thể thêm một đối sánh tùy chỉnh như sau:

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

Trên thực tế, bạn đang xác định một phương thức khởi tạo cho trình so khớp của mình - đó là một hàm trả về một đối tượng so khớp.

Bao gồm điều đó trước khi bạn 'khởi động'. Các trình kết hợp cơ bản được tải tại thời điểm khởi động.

Tệp html của bạn sẽ trông như thế này:

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

Sau đó, trong boot.js của bạn, hãy thêm lệnh gọi để thêm các đối sánh sau khi jasmine đã được xác định nhưng trước jasmine.getEnv (). Get env thực sự là một cuộc gọi thiết lập (được đặt tên hơi nhầm lẫn).

Các so khớp được thiết lập trong lệnh gọi setupCoreMatchers trong phương thức khởi tạo 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();

Họ chỉ ra một cách khác để thêm các trình so khớp tùy chỉnh trong các thử nghiệm mẫu, tuy nhiên, cách thức hoạt động là tạo lại (các) trình so khớp trước mỗi thử nghiệm bằng cách sử dụng a beforeEach. Điều đó có vẻ khá kinh khủng vì vậy tôi nghĩ thay vào đó tôi sẽ đi theo cách tiếp cận này.


5

Tôi đến muộn với điều này nhưng đăng nó đề phòng một số người vẫn truy cập câu hỏi này để tìm câu trả lời, tôi đang sử dụng Jasmine phiên bản 3.0 và như được đề cập bởi @Patrizio Rullo, bạn có thể sử dụng toBeGreaterThanOrEqual / toBeLessThanOrEqual .

Nó đã được thêm vào phiên bản 2.5 theo ghi chú phát hành - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Ví dụ

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

hoặc là

expect(percent).toBeGreaterThanOrEqual(1);

Tôi nghĩ rằng phiên bản jasmine> 2.3.4 không thực thi các thông số kỹ thuật theo thứ tự. Vì vậy, nếu họ muốn thông số kỹ thuật theo thứ tự thì họ có thể tạo các đối sánh tùy chỉnh nhưng nếu họ thấy ổn với thông số kỹ thuật không có thứ tự thì họ có thể chọn phiên bản đã đề cập ở trên.
TraxX

4

Tôi đã gặp phải vấn đề tương tự ngày hôm nay và hóa ra, không khó để thêm một trình đối sánh tùy chỉnh cho nó. Ưu điểm chính của trình so khớp tùy chỉnh là nó có thể trả về các thông báo có ý nghĩa khi kiểm tra không thành công.

Vì vậy, đây là mã cho hai người đối sánh .toBeAtLeast().toBeAtMost(), trong trường hợp nó giúp ích cho ai đó.

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

Nó vừa được hợp nhất trong nhánh chính Jasmine GitHub bản vá của tôi để thêm các đối sánh mà bạn cần:

Thêm các đối sánh toBeGreatThanOrEqual và toBeLessThanOrEqual

Nhưng tôi không biết nó sẽ được phát hành. Trong thời gian này, bạn có thể thử sử dụng mã cam kết của tôi trong bản sao Jasmine tại địa phương của bạn.


Nó được sáp nhập trong phiên bản 2.5.0 github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md
Patrizio Rullo


1

Bạn có thể sử dụng hàm leastđể kiểm tra xem một giá trị có lớn hơn hoặc bằng một số giá trị khác hay không.

Bí danh của leastgte(lớn hơn hoặc bằng). Ngược lại, bạn có thể sử dụng lte(nhỏ hơn hoặc bằng) để kiểm tra ngược lại.

Vì vậy, để trả lời câu hỏi, bạn có thể làm:

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


Bạn sử dụng phiên bản Jasmine nào? Tôi chỉ nâng cấp từ 2.6.2 đến 2.8 và tôi vẫn nhận được lỗi TypeError: Cannot read property 'be' of undefinedchoexpect(1).to.be.gte(-1);
Jonathan Levesque Chánh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.