【发布时间】:2016-10-24 12:31:25
【问题描述】:
我很难理解组件类中哪些方法应该是私有的,哪些应该是公共的。
判断方法是公共的还是私有的似乎相当容易,例如:
export class MyServiceClass {
private _cache = {}; // this value is private and shouln't be accessed from outside
public accessCache(){ // it's public as it's an API method
return this._cache;
}
public setCache(newVal){
this._cache = newVal;
}
}
按照这个逻辑,组件中的所有方法都应该是私有的,因为任何方法都不应该暴露在类之外。 (根据to that post组件和它的视图是一个实体)
export class MyComponent {
private _getRandomNumbers(){ // this is used in view only
/*..*/
}
}
没有悲剧,但是在this video 你可以了解到只有组件的公共方法才应该进行单元测试。按照上面的操作,我找不到任何理由在组件类中使用公共方法,但我仍然有一些值得测试的方法(尤其是视图中使用的方法)。这意味着我完全迷失了角度世界中私有和公共方法的含义。
所以我的问题很简单:
组件中的哪些方法应标记为公共和私有。
【问题讨论】:
-
为什么视频中的陈述会引起混淆?只测试组件的公共 API 是正常的。
-
您通常有输入和输出以及注入的依赖项,这些依赖项获取组件调用的方法或提供可观察的订阅。您还可以访问生成的 DOM 并测试它是否包含预期的内容。
-
@GünterZöchbauer 这是因为遵循这个逻辑,当组件中的所有方法都是私有的(仅在内部或组件模板中使用)时,没有什么可测试的。
-
如果你想在不调查结果视图的情况下测试组件类(仅限控制器),那么我认为将视图视为不同的单元并使视图访问的所有成员都是有意义的公开而不是私有。
-
@GünterZöchbauer 这是一个非常有效的问题,它更多地适用于 Typescript 最佳实践而不是 Angular。考虑私有方法,黑盒会极大地损害可测试性。私有成员应该是可访问的、可监视的和可模拟的。
reflect-metadata可以帮忙吗?我在功利主义环境 (DI) 中遇到过这种情况,但从来没有进行过基本的反思。
标签: angular typescript