Javascript 角度单元测试:这段代码值得单元测试吗?

Javascript 角度单元测试:这段代码值得单元测试吗?,javascript,angular,unit-testing,jasmine,karma-jasmine,Javascript,Angular,Unit Testing,Jasmine,Karma Jasmine,我刚刚开始在angular中进行单元测试。我很难弄清楚应用程序中的单元测试应该包括哪些内容。我应该测试下面的代码吗 如果我这样做,我将基本上传递一个有效的mode值,并检查defaultProperties的各种属性的正确值是否由this.propertiesSource发出。这不就像一遍又一遍地写同样的代码吗?这只是一个例子,应用程序中充满了这样的实例 如果我不测试这些东西,那么我的代码覆盖率可能可以忽略不计 以下是来自组件的代码示例: mode: string; defaultProp

我刚刚开始在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
    }  
   }

虽然这看起来有点乏味,但最好是尽可能地进行单元测试

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

  • 您可以测试边缘情况。例如,如果mode为null或是您没有计划的值,您该怎么办。你需要有能力处理这件事
  • 对于未来的开发者。如果有人出现并意外更改其中一个值,您的测试将失败,您将知道有问题。如果他们更改了值,则需要更改测试。因此,验证了变化实际上是应该发生的

  • 如果可以测试,就应该进行测试。

    虽然这看起来有点乏味,但最好是尽可能地进行单元测试

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

  • 您可以测试边缘情况。例如,如果mode为null或是您没有计划的值,您该怎么办。你需要有能力处理这件事
  • 对于未来的开发者。如果有人出现并意外更改其中一个值,您的测试将失败,您将知道有问题。如果他们更改了值,则需要更改测试。因此,验证了变化实际上是应该发生的

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

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

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

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


    要查看这些设置是否正确,因此您必须在代码与小部件库集成的地方执行测试,以查看设置是否真正达到预期效果-但这不再是单元测试。

    正如Shashank Vivek所指出的,似乎存在大量冗余。也许可以考虑一些常见的功能

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

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


    要查看这些设置是否正确,因此您必须在代码与小部件库集成的地方执行测试,以查看设置是否真正达到预期效果-但这不再是单元测试。

    因为
    propertiesSource
    是私有的,我假设它是由组件本身的某个地方订阅的,对吗
    那么,为什么要创建observable,因为它在同一个组件中
    ?我认为您的担心是正确的,您应该重新设计代码以减少冗余代码。如果在整个角度项目中都复制了相同的代码,那么也应该避免编写太多的
    if
    else
    ,您能解释一下组件的预期性能吗。或者更多关于它的代码,这样我可以从改进(如果有的话)中提出建议,因为
    propertiesSource
    是私有的,我假设它是由组件本身的某个地方订阅的,对吗
    那么,为什么要创建observable,因为它在同一个组件中
    ?我认为您的担心是正确的,您应该重新设计代码以减少冗余代码。如果在整个角度项目中都复制了相同的代码,那么也应该避免编写太多的
    if
    else
    ,您能解释一下组件的预期性能吗。或者更多关于它的代码,以便我可以从改进中提出建议(如果有的话)