如何检查函数是否有参数以及是否有数字

时间:2014-08-25 21:44:16

标签: javascript unit-testing mocha chai

我是unitTesting并使用Mocha / Chai的新手。我试图测试函数是否有参数,如果它是一个数字。

// Main Function
function Sh(partnerUserId) {


  function validPartnerId(partnerUserId) {
    if (!partnerUserId);
    throw new Error("Missing partnerId");


    if (isNaN(partnerUserId));
    throw new Error("Not a number");

    return true;
  }
}



// Unit Test

var expect = chai.expect;

describe("Sh", function() {

    it('should check if the partnerId is provided', function(){
        ????
    });


    it('should check if the partnerId is a number', function(){
       ????
    });

});

如果有更好的方法,我愿意接受建议。我试图找到如何捕获参数的值并在单元测试中验证它。

2 个答案:

答案 0 :(得分:2)

您的Sohalo功能目的尚不清楚。我不得不重写它以获得一个有意义的功能。无论如何,您需要使用什么来检查检查是否正在进行expect(fn).to.throw(...)。它的文档是here。请注意,当您要检查具有特定参数的调用是否会引发异常时,方便的方法是使用bind。如下所示:

expect(Sohalo.bind(undefined, 1)).to.not.throw(Error, "Not a number");

将测试通话Sohalo(1)。 (bind的第一个参数设置了函数内this的值,我们在这里不需要它,所以我要离开它undefined

所以一个包含你的函数并测试它的文件看起来像这样:

function Sohalo(partnerUserId) {
    if (typeof partnerUserId !== "number" || isNaN(partnerUserId))
        throw new Error("Not a number");
}

var chai = require("chai");
var expect = chai.expect;

describe("Sohalo", function() {
    it('should fail if partnerUserId is not given', function(){
        // This tests calling Sohalo with no arguments whatsoever.
        expect(Sohalo).to.throw(Error, "Not a number");
    });

    it('should fail if partnerUserId is not a number', function(){
        expect(Sohalo.bind(undefined, {})).to.throw(Error, "Not a number");
    });

    it('should fail if partnerUserId is NaN', function(){
        expect(Sohalo.bind(undefined, NaN)).to.throw(Error, "Not a number");
    });

    it('should not fail if the partnerUserId is a literal number', function(){
        expect(Sohalo.bind(undefined, 1)).to.not.throw(Error, "Not a number");
    });

    it('should not fail if the partnerUserId is a Number object', function(){
        expect(Sohalo.bind(undefined, Number(10))).to.not.throw(Error, "Not a number");
    });
});

在我的测试套件中,我通常会使用expect().to.throw执行测试,但不会使用expect().to.not.throw执行测试。我只是用好的参数调用它并检查结果是否正确,而不是显式检查函数是否抛出。我在这里使用expect().to.not.throw仅仅是为了说明。

答案 1 :(得分:0)

使用类似的东西:

function isNumber(x) {
  return typeof x === 'number';
}

然后,在其他地方,您可以使用isNumber函数来确定x是否为数字,并做出相应的反应:

function Sohalo (partnerUserId) {
  if (!isNumber(partnerUserId)) {
    // if it's not a number, throw exception
    throw new Error('partnerUserId needs to be a number!');
  }
  // ... do other stuff down here ...
}

单元测试建议:

创建一个这样的对象:

var sohalo = (function () {
  var me = {},
      id;

  function isNumber(x) {
    return typeof x === 'number';
  }

  function isDefined(x) {
    return typeof value !== 'undefined';
  }

  me.validatePartnerId = function () {
    return isDefined(id) && isNumber(id);
  }

  me.setPartnerId = function (newId) {
    id = newId;
  };
  me.getPartnerId = function () {
    return id;
  };

  return me;
})();


describe('sohalo', function () {

  it('should check if the partner id is provided', function () {
    var id = sohalo.getPartnerId();
    id.should.equal(undefined);
  });

  it('should check if the partner id is a number', function () {
    sohalo.setPartnerId(5);
    sohalo.validatePartnerId().should.equal(true);
    sohalo.setPartnerId('5');
    sohalo.validatePartnerId().should.equal(false);    
  });
});

这是我发现的一个帖子,它给出了一个小例子:https://gist.github.com/michaelcox/3800736

希望这有帮助