2017-10-15 33 views
1

我想测试是否从另一个方法(方法2)调用本地方法(方法1)。我尝试了这样的方法,但它不起作用,因为method1()仍然有的原始定义。该代码片段看起来是这样的:使用茉莉花如何检查本地方法是否被调用?

var ClassA = function() { 
    var method1 = function() { 
     console.log('method1'); 
    }; 
    var method2 = function() { 
     method1(); 
    }; 
    return {method1: method1, method2: method2} 
} 

测试用例:

it("should call method1 when method2 is called", function() { 
    var objectA = new ClassA(); 
    spyOn(objectA, 'method1').andCallThrough; 
    objectA.method2(); 
    expect(objectA, 'method1').toHaveBeenCalled(); 
}); 

试图重写方法1到没有任何成功:

objectA.method1 = jasmine.createSpy('aSpy').andCallThrough(); 
+0

你的代码看起来不错,但是,你在'spyOn(objectA,'method1')。和.CallThrough''行中缺少'()'。 –

回答

0

当你调用new ClassA的()调用的ClassA的功能,并获得与相关原型的新对象。这意味着当你使用spyOn(ClassA,“doSomething”)时,你并没有在新的调用返回的对象上设置一个间谍,而是在ClassA函数本身的一个可能的doSomething函数上。 你应该能够做这样的事情:

it("calls method1", function() { 
    var originalConstructor = ClassA, 
     spiedObj; 
    spyOn(window, 'ClassA').and.callFake(function() { 
    spiedObj = new originalConstructor(); 
    spyOn(spiedObj, 'method1'); 
    return spiedObj; 
    }); 
    method2(); 
    expect(spiedObj.method1).toHaveBeenCalled(); 
}); 

请让我知道,如果这个工程如果不是我们可以讨论更多。

+0

Apurva,谢谢你的回复。 它适合你吗? method2()是从spiedObj还是originalConstructor调用? – ambar