【问题标题】:Angular JS Unit testing: how to test function in service that doesn't returnAngular JS单元测试:如何测试服务中不返回的功能
【发布时间】:2018-10-19 13:23:54
【问题描述】:

对于可能的重复,我很抱歉,我没有为我的问题找到任何解决方案。

我需要为 Angular JS 应用中的服务编写测试。

所以我有一个主要函数返回并用作外部方法。还有一些外部帮助功能。那么如何在帮助函数 (subFunc) 中调用和测试内容呢?

service.js

function TestService() {
  return {
    mainFunc: mainFunc
  };

  funcion mainFunc() {
    //do some and call subFunc()
    subFunc(a)
  }

  function subFunc(a) {
    if (a === 1) {
      // ... magic 1
      return true;
    } else {
      // ... magic 2
      return false;
    }
  }
}
})()

service.spec.js

describe('Test Service', function() {
  beforeEach(module('TestService'));
  var TestService;

  beforeEach(inject(function($injector) {
      TestService = $injector.get('TestService');
  }));

  it('should return true if subFunc called with 1', function () {
    // ....
  });
})

【问题讨论】:

  • 您不必重新设计代码以适应您的测试。我确定“要求”是提供 API 的测试覆盖率。如果您正确彻底地测试mainFunc(),那么这些测试将为subFunc() 提供覆盖。在这种情况下,通过这种设计,代码单元是mainFunc()subFunc() 的组合。这个想法没有错,你的目标可以实现。对此有一种迂腐的观点和一种实际的观点。你会在这里得到关于这两个方面的意见。
  • 好吧,请看一下您设计的代码。 subFunc() 返回一个布尔值,mainFunc() 从不做任何事情。如果您想直接回答代码问题 - 提供可以做某事的代码。另外,我不知道herewhere是什么意思。

标签: javascript angularjs unit-testing karma-jasmine


【解决方案1】:

重写 TestService 以公开subFunc,以便您可以使用间谍对它进行存根并跟踪它是否被调用。

这是您在编写代码之前和编写代码时编写测试的原因之一:它们会影响代码的风格,从而使测试更容易。在这种情况下,subFunc 必须在外部可见,以便于测试,因此使其可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2017-06-03
    相关资源
    最近更新 更多