测试对象内部方法是否被执行的最佳方法

时间:2016-12-01 13:54:41

标签: javascript unit-testing

我创建了这段代码

function myFunction() {
  var myObject = {
    objProperty: "string",
    objMethod: function() {
      return myObject.objProperty;
    }
  };

  return myObject.objMethod();
};

现在我正在尝试进行单元测试,以检查代码是否按预期运行:

describe("checking syntax and function integrity", function(){

    // called before each spec is ran
    before(function(){

    });

    it ("should return 'string' when myFunction is called", function(){
        Test.assertEquals(myFunction(), 'string', 'myFunction did not return "string"');
    });

    it ("should check if myObject.objMethod was called", function(){

    });
});

我的问题:是否可以检查myObject.objMethod是否被调用?我正在使用CodeWars提供的测试框架。

Here is a link to their test framework

1 个答案:

答案 0 :(得分:0)

看来这个测试框架不支持这样的事情。但你可以这样做:

it ("should check if myObject.objMethod was called", function(){
  let oldMethod=myObject.myMethod;
  let callCount=0;
  myObject.myMethod=function(){
    callCount++;
    oldMethod.apply(this,arguments);
  }
  //do stuff that should trigger the method
  //and then... check!!! :
  Test.assertEquals(callCount,1); 
});

修改:我没有看到myObject是myFunction()的内部对不起,抱歉。所以答案是:

你不能!因为你的测试环境无法访问myObject。在这里测试它甚至没有意义,因为它是你的功能的内部。您可以(并且应该)测试的唯一事情是MyFunction()调用返回一个字符串,可能是一个匹配某些随机标准的字符串。

如果它至少不是一个对象文字,而是一个从构造函数实例化的对象,它应该得到自己的测试,但这不是这里的情况。

如果要测试myObject的行为,请将其重复使用:创建MyObject()构造函数,或通过参数将对象传递给myFunction(myObject)调用。