Javascript 函数调用上的Jasmine SpyOn

Javascript 函数调用上的Jasmine SpyOn,javascript,jquery,jasmine,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#

你好,我有一个关于用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()方法不存在


有人知道这是为什么吗?我如何解决这个问题?

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

  • 你告诉Jasmine监视名为
    Test2
    myMock
    方法,但它没有这样的方法(正如Jasmine告诉你的)
    Test2
    只是一个常规函数
  • 即使它确实有一个名为
    Test2
    的方法,您也会在
    new Test()
    之后对其进行监视,此时原始的
    Test2
    可能已经被调用了,并且该监视将被宣布为时已晚
  • 原始的
    Test2
    没有返回值,但是你告诉间谍它应该返回
    10,10
    (在我看来,你想用这两个值调用它,而不是让它返回它们)
  • Test2
    除了创建一个局部变量(
    result
    )并记录它之外,没有任何副作用(比如返回一个值或设置一个实例变量等),这使得它非常不稳定
我认为你需要回到绘图板上,明确你希望这个类做什么。为了帮助您,这里有一个可能的实现,包括一个测试,以查看a)是否使用正确的参数调用
Test2
,以及b)其返回值是否正确存储(同样,我不知道您希望该类做什么,所以我只提供一些示例):


请看,那里的共识是“不,他们不应该”!感谢您的反馈@Andreasniedermir。我改了标题非常感谢你!这真是一个很好的解释。我对《茉莉花》中间谍的工作方式有点迷茫。你的例子和解释对我很有帮助。
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);
  });
});