如何使用jasmine或mocha对使用参数的javascript函数进行单元测试

时间:2014-09-02 06:41:51

标签: javascript unit-testing asynchronous jasmine mocha

我有一个简单的问题。如何对依赖于参数的函数进行单元测试?比如说:

代码:

function a(param) {
   if(param > 0) 
      return param+value;
   else
      return param;
}

如何在没有参数的情况下对功能a进行单元测试?我听说我在茉莉花中使用嘲笑或间谍。有人能告诉我一个例子,我真的很困惑。谢谢大家。

修改

感谢大卫这样一个全面的回答。对此,我真的非常感激。以下是有关我的问题的更多信息。

这实际上是我的真实问题,我有一个文件

snap-fed.js

//Code here...

当我向你展示时,我想全面地进行单元测试。但我不确定如何使用茉莉或摩卡这样做。

我怎么能测试snap对象的任何方法?我怎么能单元测试snap.eligibility或snap.isSnapResourceEligibile?我已经被困在这个问题上大约2天了,我真的不明白。

它们都接受参数信息,该参数信息提供有关方法正在处理的对象的信息。

这是我真正的问题,但我不知道怎么问。

编辑2:

基于David的模板,我做了这个,但它甚至没有运行......

snap-fed.spec.js

describe("snap-fed", function() { 

  describe("Properties", function() { 

    it("should exist", function() {
      expect(Allowance).not.toBeUndefined(); 
      expect(AllowanceAdditional).not.toBeUndefined();
      expect(MaxAllowanceHouseholdSize).not.toBeUndefined();
    }); 

    it("should contain correct values", function() {
        expect(Allowance).toEqual([189, 347, 497, 632, 750, 900, 995, 1137]);
        expect(AllowanceAdditional).toBe(142);
        expect(MaxAllowanceHouseholdSize).toBe(Allowance.length);
    }); 
  });

  describe("Functions", functions(){

    it("should return the expected result", function() {
      expect(snap.isSnapResourceEligible(info)).toBeTruthy();
    });

    //Put more test cases for the various methods of snap

  });

}); 

1 个答案:

答案 0 :(得分:4)

测试在Jasmine中看起来像这样:

    describe("Function a", function() {

      it("is defined", function() {
        expect(a).not.toBeUndefined();
      });

      it("should return expected result for a positive parameter", function() {
        var result = a(19);

        expect(result).toEqual(24);
      });

      it("should return expected result for a negative parameter", function() {
        var result = a(-1);

        expect(result).toEqual(-1);
      });

      it("should return expected result for parameter zero", function() {
        var result = a(0);

        expect(result).toEqual(5);
      });

    });

这种情况期望函数value内的变量a是一个等于5的常量。场景可能更复杂,测试看起来会有所不同。如果有关于value变量的任何逻辑,请在您的问题中显示,然后我会编辑我的答案。

编辑:问题的第二部分的测试样本

因此,在删除Q.fcall后,如果资格函数看起来像这样:

eligibility: function (info) {
            return {
                eligible : snap.isSnapIncomeEligible(info) && snap.isSnapResourceEligible(info),
                savings : snap.calcSavings(info)
            };
    }

然后你可以测试像这样的快照对象:

describe("Snap", function() {

  var snap = ... //get the snap object here...

  var disabledMemberInfo = {
    disabledMember: true,
    age: 50,
    fpl: 1.2,
    householdSize: 10,
    moneyBalance: 4000
  };

  it("is defined", function() {
    expect(snap).not.toBeUndefined();
  });

  it("has eligibility defined", function() {
    expect(snap.eligibility).not.toBeUndefined();
  });

  it("return positive eligibility for disabled member with fpl < 1.2 and money balance 4000", function() {

    var result = snap.eligibility(disabledMemberInfo);

    expect(result).not.toBeUndefined();
    expect(result.eligible).not.toBeUndefined();
    expect(result.savings).not.toBeUndefined();

    expect(result.eligible).toEqual(true);
  });

});

我没有通过测试覆盖整个快照对象。但是更多的测试将是类似的,我的代码应该是一个例子,并以类似的方式构建更多的测试。