javascript - 使用Jasmine如何检查本地方法是否已被调用?

标签 javascript unit-testing jasmine karma-jasmine

我正在尝试测试是否从另一个方法(method2)调用本地方法(method1)。我尝试了类似的方法,但它不起作用,因为 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();

最佳答案

当您调用 new ClassA() 时,您将调用 ClassA 函数并获取具有相关原型(prototype)的新对象。这意味着当您进行 spy 操作(ClassA,“doSomething”)时,您并不是在新调用返回的对象上设置 spy ,而是在 ClassA 函数本身的可能的 doSomething 函数上设置 spy 。 您应该能够执行以下操作:

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();
});

请告诉我这是否有效,如果不行我们可以讨论更多。

关于javascript - 使用Jasmine如何检查本地方法是否已被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46754691/

相关文章:

javascript - .defaultProps 是否适用于无状态 React 组件?

javascript - 如何使 Facebook Like 按钮的宽度自动调整大小?

javascript - 如何防止点击事件相互重叠?

javascript - 简洁地表达复杂的正则表达式

jasmine - 没有 Jasmine-jquery 的提供者?

javascript - 使用 Jasmine 对 api 的 promise 进行单元测试

AngularJs 单元测试 - 检查 "Init"函数是否被调用

javascript - 按字母顺序对输入/复选框元素排序

java - JMockit 在单元测试中保持不变

Angular 2/4组件单元测试点击事件不触发变化