关于函数调用的Jasmine SpyOn

时间:2016-01-11 13:16:07

标签: javascript jquery jasmine

您好我有一个关于使用Jasmine模拟JS代码的问题。

想象一下有以下情况:

function Test(){
    var a = 5;
    var b = 3;
    Test2(a,b);
}
function Test2(a,b){
    var result = a + b;
    console.log("result of function Test2: ", result);
}

我想用Jasmine模拟我的Test2函数调用。我尝试了以下的事情:

describe("1# Test Mocking", function () {                                   
    it("test: Mocking Example", function () {                                                           
        var myMock = new Test();                        
        spyOn(myMock, "Test2").and.returnValue(10,10);              
        expect(Test2.result).toEqual(20);       
    });         
});   

但Jasmine一直说:Error: Test2() method does not exist

有谁知道这是为什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我害怕你的代码没有多大意义:

  • 你告诉Jasmine要监视一个名为myMock Test2的方法,但它没有这样的方法(就像Jasmine告诉你的那样); Test2只是一个常规功能;
  • 即使它确实有一个名为Test2的方法,你在 new Test()后监视它,此时原来的Test2已经有了被召唤,间谍宣布为时已晚;
  • 原始Test2没有返回值,但是你告诉间谍它应该返回10, 10(在我看来你想要调用它有了这两个值,没有它返回它们);
  • Test2除了创建局部变量(result)并记录它之外没有任何副作用(比如返回值或设置实例变量等),这使得它很漂亮不可测;

我认为你需要回到绘图板来制定你希望班级做什么。为了帮助你,这里有一个可能的实现,包括一个测试,看看a)是否用适当的参数调用Test2和b)如果它的返回值被正确存储(再次,我不知道是什么你想让班级做,所以我只是提供一些例子):

function Test() {
  var a = 5;
  var b = 3;
  this.result = this.Test2(a, b);
}

Test.prototype.Test2 = function(a, b) {
  var result = a + b;
  return result;
}

describe("1# Test Mocking", function () {
  it("test: Mocking Example", function () {
    spyOn(Test.prototype, 'Test2').and.returnValue(20);
    var myMock = new Test();
    expect(myMock.Test2.calls.argsFor(0)).toEqual([ 5, 3 ]);
    expect(myMock.result).toEqual(20);
  });
});