【问题标题】:Angular Unit Testing: Is this code worth unit testing?Angular 单元测试:这段代码值得单元测试吗?
【发布时间】:2019-11-03 00:00:32
【问题描述】:

我刚刚开始用 Angular 进行单元测试。我很难弄清楚应用程序中的单元测试应该涵盖哪些内容。我应该测试下面的代码吗?

如果我这样做,我实际上将传递一个有效值 mode 并检查 defaultProperties 的各种属性的正确值是否由 this.propertiesSource 发出。这不就像一遍又一遍地编写相同的代码吗?而这只是一个例子,应用中充满了这样的例子。

如果我不测试这些东西,那么我的代码覆盖率可能可以忽略不计。

下面是组件代码示例:

 mode: string;
  defaultProperties = {
    editable: this.editable,
    showToolbar: this.showToolbar,
    viewMode: this.viewMode,
    editMode: this.editMode,
    showPopup: this.showPopup,
    formSavedClicked: this.formSavedClicked,
    cancelClicked: this.cancelClicked,
    refresh: this.refresh,
  };
  private propertiesSource = new BehaviorSubject(this.defaultProperties);

要测试的方法:

 setGridMode(mode) {
    this.mode = mode;
    if (mode === "edit") {
      this.propertiesSource.next({
        editable: true,
        showToolbar: true,
        viewMode: false,
        editMode: true,
        showPopup: false,
        formSavedClicked: this.formSavedClicked,
        cancelClicked: this.cancelClicked,
        refresh: false,

      });
    } else if (mode == "save") {
      this.propertiesSource.next({
        editable: false,
        showToolbar: false,
        viewMode: true,
        editMode: false,
        showPopup: false,
        formSavedClicked: this.formSavedClicked,
        cancelClicked: this.cancelClicked,
        refresh: true,
      })
      // more code..multiple if else block like above
    }  
   }

【问题讨论】:

  • 因为propertiesSource 是私有的,我假设它被组件本身的某个地方订阅,对吧? Then, why are creating observable is its in the same component ?我认为您的担忧是有效的,您应该重新设计代码以减少冗余代码。如果在整个 Angular 项目中复制相同的代码,也应该避免编写这么多的 ifelse
  • 你能解释一下组件的ExpectedBahavior吗?或有关它的更多代码,以便我可以提出改进建议(如果有)

标签: javascript angular unit-testing jasmine karma-jasmine


【解决方案1】:

虽然这可能看起来有些乏味,但最好对所有可以进行的单元测试。

出于以下几个原因,我会对此进行单元测试:

  1. 您可以测试边缘情况。例如,如果 mode 为 null 或您没有计划的值,您会怎么做。你需要能够处理好它。
  2. 面向未来的开发人员。如果有人突然出现并意外更改了其中一个值,您的测试将失败并且您会知道有问题。如果他们更改值,这将需要更改测试。因此,验证更改是否应该实际发生。

如果可以测试,就应该测试。

【讨论】:

    【解决方案2】:

    正如 Shashank Vivek 所指出的,似乎有很多冗余。也许可以排除一些常见的功能。

    除此之外,代码当然应该经过测试,但不一定必须通过单元测试来完成。可能集成测试或 UI 测试是更适合的方法:使用单元测试,正如您正确观察到的,您的测试可能只是复制代码。但是,它们可能不会很有价值,因为它们不会帮助您找到错误。

    我假设这些设置旨在配置某些小部件库或类似内容的行为。当然,您可以编写一个测试来检查mode“编辑”refresh 的值是否为false。此测试基于您的假设,即此设置将导致相应小部件的特定行为。但是,即使你的假设是错误的,单元测试仍然会通过,因为它只是反映了你自己的错误理解。

    要查看这些设置是否正确,因此您必须在代码与小部件库集成的情况下执行测试,以查看设置是否实际产生预期效果 - 但这不再是单元测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2020-08-08
      • 2017-04-04
      • 2019-03-24
      相关资源
      最近更新 更多