Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript单元测试私有和受保护方法_Typescript_Jasmine_Mocha.js_Webstorm_Chai - Fatal编程技术网

Typescript单元测试私有和受保护方法

Typescript单元测试私有和受保护方法,typescript,jasmine,mocha.js,webstorm,chai,Typescript,Jasmine,Mocha.js,Webstorm,Chai,我希望能够测试privateTypescript方法。请跳过关于为什么这是个坏主意的讲座。我听说过 以下是演示代码: class MyClass { age: number private ageAsString(): string { return '15' } } 以下是我在测试文件中的选项: 1-写入允许ts编译此行的/@ts ignore。当您调用200 xexpect()s时,这会很快变得不方便。但是我找不到一种方法来实现这个基于块的基于文件

我希望能够测试private
Typescript
方法。请跳过关于
为什么这是个坏主意的讲座
。我听说过

以下是演示代码:

class MyClass {
    age: number

    private ageAsString(): string {
        return '15'
    }
}
以下是我在测试文件中的选项:

1-写入允许ts编译此行的
/@ts ignore
。当您调用200 x
expect()
s时,这会很快变得不方便。但是我找不到一种方法来实现这个基于块的基于文件的方法

it('Test ageAsString', () => {
    // @ts-ignore
    expect(new MyClass().ageAsString()).to.equal('15')
})
2-将类对象转换为任何对象。这将禁用从TS和IDE获得的自动完成和重构功能。一开始这似乎是个好主意,但一个月后,它要么会破坏我的200个测试用例,要么会产生一些无法预料的bug

it('Test ageAsString', () => {
    const anyClass: any = new MyClass
    expect(anyClass.ageAsString()).to.equal('15')
})
3-可以使用阵列访问,这可以工作,但会产生与#2相同的问题

我希望能够以某种方式测试这些方法,而不会有缺点。现在我有两个选择,两个都不好

  • 跳过编写特定的详细单元测试
  • 公布方法

  • 请给我第三个选项

    测试受保护方法的另一种方法是创建一个伪类并扩展需要测试的类

    class MyClass {
      protected test() {
        return true;
      }
    }
    

    如果你真的那么想说,那就把它公之于众。否则,,只需使用调用此私有方法的另一个MyClass方法,并确保它返回正确的结果。但我同意,如果您实际测试所有公共方法,则测试私有方法是非常不必要的。如果您使用的是类,则测试较小的私有函数比测试较大的公共函数更容易和更可读那么,您的可测试私有方法可能应该是其他服务的公共函数,这些服务只负责此项工作。显然,这并不容易和简单,因此,这个问题没有其他答案D
    class MyClass {
      protected test() {
        return true;
      }
    }
    
    class FakeMyClass extends MyClass {
      public test() {
        return super.test();
      }
    }
    
    it('test', () => {
        const myClass = new FakeMyClass();
        expect(myClass.test()).to.true;
    })