如何在Jasmine中测试值“大于或等于”?


94

我想确认一个值是一个十进制(或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匹配器:jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
克里斯·帕顿

Answers:


108

我想我应该更新此内容,因为新版本的Jasmine中的API已更改。Jasmine API现在内置了以下功能:

  • 大于等于
  • 小于等于

您应该优先于以下建议使用这些功能。

单击此处以获取有关Jasmine Matchers 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是一个数字,则仅是反函数。否则,它不是反函数。)
Kristian Hanekamp,

就像@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 2015年

@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之后但在jasmine.getEnv()之前添加匹配器。Get env实际上是一个(有点误导性的)设置调用。

匹配器在Env构造函数中对setupCoreMatchers的调用中获得设置。

/**
 * ## 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;
        }
      };
    }

  } );

} );



1

您可以使用该功能 least检查一个值是否大于或等于其他某个值。

的别名leastgte(大于或等于)。反之亦然,您可以使用lte(小于或等于)检查相反的情况。

因此,要回答该问题,您可以执行以下操作:

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


您使用哪个版本的Jasmine?我刚刚升级从2.6.2到2.8,我仍然得到错误TypeError: Cannot read property 'be' of undefinedexpect(1).to.be.gte(-1);
乔纳森家长Lévesque这样
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.