如何测试值是否大于或等于#34;在Jasmine?

时间:2014-06-06 20:41:12

标签: javascript tdd jasmine

我想确认一个值是十进制(或0),因此该数字应大于或等于零小于1.

describe('percent',function(){  

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

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

  });

});

我如何模仿“> = 0”?

11 个答案:

答案 0 :(得分:95)

我知道这是一个古老且已经解决的问题,但我注意到错过了一个相当简洁的解决方案。由于大于或等于小于函数的倒数,请尝试:

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

在这种方法中,百分比的值可以由异步函数返回,并作为控制流的一部分进行处理。

答案 1 :(得分:64)

您只需先运行比较操作,然后检查它是否真实。

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

    var percent = insights.percent;

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

  });   
});

答案 2 :(得分:11)

当前版本的Jasmine支持toBeGreaterThan和toBeLessThan。

expect(myVariable).toBeGreaterThan(0);

答案 3 :(得分: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
                           };
                       }
                   };
               }
    );
};

实际上,您为匹配器定义了一个构造函数 - 它是一个返回匹配器对象的函数。

在你开机之前加入#39;基本匹配器在启动时加载。

您的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()之前添加匹配器。获取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的每次测试之前重新创建匹配器。这看起来非常可怕,所以我想我会采用这种方法。

答案 4 :(得分: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;
        }
      };
    }

  } );

} );

答案 5 :(得分:4)

它刚刚在Jasmine GitHub主分支中合并了我的补丁,以添加您需要的匹配器:

Add toBeGreatThanOrEqual and toBeLessThanOrEqual matchers

但我不知道它会在哪个版本发布。在此期间,您可以尝试在本地Jasmine副本中使用我的提交代码。

答案 6 :(得分:4)

我迟到了,但发布它以防万一有人仍在访问这个问题寻找答案,我使用的是Jasmine 3.0版,如@Patrizio Rullo所提到的,你可以使用 toBeGreaterThanOrEqual / toBeLessThanOrEqual

根据发行说明 - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

在2.5版中添加了它

例如

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

expect(percent).toBeGreaterThanOrEqual(1);

答案 7 :(得分:1)

我建议使用这个Jasmine插件: https://github.com/JamieMason/Jasmine-Matchers

答案 8 :(得分:1)

您可以使用函数least检查某个值是否大于或等于某个其他值。

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

所以,要回答这个问题,你可以这样做:

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

答案 9 :(得分:0)

让我感到惊讶的是,上述所有人都浪费了很多时间来尝试“茉莉花方式”,而多年来,茉莉花匹配者被证明是不方便的,并且仅涵盖基本案例。

添加自定义匹配器的答案更加糟糕,因为它将使新的开发人员感到惊讶,这些开发人员将来会加入您的团队,也许除了您将使用它之外,没有其他人。

为什么不简单

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

    var percent = insights.percent; 
    expect(percent>=0 && percent<1).toBeTruthy();
  });
});

继续前进,做些有用的事情吗?测试用例名称已经在告诉您应该使用的百分比。

答案 10 :(得分:0)

使用此更新的公式:

要大于等于 toBeLessThanOrEqual

应该工作!