【问题标题】:else path not taken on a singleton class constructor否则路径未在单例类构造函数上采用
【发布时间】:2021-02-20 01:04:26
【问题描述】:

免责声明:测试作业的一部分。鉴于这门课,我应该为它写两个测试,但我被告知我没有涵盖所有边缘。我注意到构造函数没有采用其他路径。我该怎么办?

import { Proccessor } from '../../services/processor';

class processForm {


  constructor() {
    if (!processForm.instance) {
      processForm.instance = this;
    }
    return processForm.instance;
  }

  setData(data) {
    this.Proccessor.prepareData(data);
  }
  resetData(){
      this.Proccessor.resetData();
  }
}

const SetForm = new processForm();

export default SetForm;

抛开现有的模拟,我是这样做的:

    import SetForm from './SetForm';
    describe('Process data', () => {

       test('can set data', () => {});
       test('can reset data', () => {});
     });

我的测试通过了,但我注意到以下警告:

    else path not taken

  constructor() {
   **E** if (!processForm.instance) {
      processForm.instance = this;
    }
    return processForm.instance;
  }

虽然我不允许编辑课程本身,但我确实尝试过 /* istanbul igore else */ 没有效果。我到底错过了哪些报道?

【问题讨论】:

  • 在 JS 开发者场景中,关于你所拥有的构造函数是否应该被认为是合法的(它当然不是 GoF 风格的 Singleton,即使它确实有效)正在进行一场圣战,因为它违反了 new 运算符始终返回对单独对象标识的引用的期望)。请问这里的背景故事是什么?
  • 是否允许在不更改类本身的情况下以不同方式导出processForm 类?
  • @Dai 这一章是关于单元测试,主要用于模拟(导入的服务),但我被告知我没有涵盖所有边缘情况。
  • @xdhmoore 我不确定,但我认为只要我不从根本上更改提供的类,我仍然可以提交。

标签: jestjs


【解决方案1】:

几个想法:

processForm 文件正在导出一个 SetForm 对象。除非我弄错了,否则这意味着构造函数被调用的唯一地方就是这一行:

const SetForm = new processForm();

由于对象 SetForm 被导出,构造函数只被调用一次,而你提到的 if 语句只有在构造函数被多次调用时才会被调用。所以每次import SetForm,都会得到同一个对象,并且不调用构造函数。

另一种方法是导出构造函数本身:

export default processForm as SetForm;

然后当你导入它时,你必须调用 new :

import SetForm from './SetForm';
let myObj1 = new SetForm();
let myObj2 = new SetForm();

如果您调用构造函数两次,那么您最终应该调用该代码。我想这都是假设 if block 是您的教授所指的地方。

我不是新导入机制方面的专家,我敢肯定在某些情况下,您希望导出然后导入相同的对象(可能是单例模式),但在少数情况下使用它们时,我导出了一个构造函数,以便可以导入它并在其上调用 new 以创建新对象。

作为旁注,您可以将 --coverage 标志传递给 jest(或在配置中设置),它会为您提供覆盖百分比,这可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多