Angularjs $compile vs$componentController

Angularjs $compile vs$componentController,angularjs,testing,angularjs-directive,Angularjs,Testing,Angularjs Directive,我对Angular比较陌生,已经开始用组件架构编写我的应用程序。查看时,建议使用$componentControllermock方法测试组件 然而,当我看指令传统上是如何在Angular pre-1.5中进行测试时,似乎首选的方法是使用$compile服务来实际构建指令模板和所有内容。通过使用$compile可以对模板逻辑和控制器逻辑进行断言。然而,使用$componentController方法,您只能测试控制器逻辑,因为大多数复杂性都存在于模板和服务中,因此实际上似乎并不那么有用 有人能解释

我对Angular比较陌生,已经开始用组件架构编写我的应用程序。查看时,建议使用
$componentController
mock方法测试组件

然而,当我看指令传统上是如何在Angular pre-1.5中进行测试时,似乎首选的方法是使用
$compile
服务来实际构建指令模板和所有内容。通过使用
$compile
可以对模板逻辑和控制器逻辑进行断言。然而,使用
$componentController
方法,您只能测试控制器逻辑,因为大多数复杂性都存在于模板和服务中,因此实际上似乎并不那么有用


有人能解释一下现代最佳实践吗?对我来说,使用
$compile
更有意义,这样您也可以测试模板。但是为什么AngularJS文档根本没有提到这一点,而是推荐
$componentController

AngularJS最大的问题之一是它有
$scope
。这是您将绑定放在DOM中使用的位置。这引起了许多混乱

每个好的应用程序设计都应该有层:业务逻辑、UI等。在AngularJS中,这些层与业务逻辑的
控制器
和UI的
指令
非常对应。然而,由于
$scope
指令中可用,许多人决定不使用控制器,而是将所有业务逻辑放在指令中。这导致了难以测试的指令,因为它们同时实现了两个层。由于DOM操作缓慢,测试也变得缓慢

理想情况下,您应该尽可能多地在业务逻辑中进行测试,而在UI中进行更少的测试。由于该框架处理业务逻辑和UI之间的同步,所以几乎不可能出现bug。但业务逻辑是引入大多数bug的地方。这就是为什么在较新的AngularJ中,他们建议使用
$componentController
来测试控制器中的业务逻辑,而不是指令


New Angular没有
$compile
,大多数测试都是为控制器编写的,控制器在那里作为类实现。

回答w/a注释,b/c这可能更像是一种观点。我想你已经一针见血了,你对两者之间的差异得出了结论。在引入组件之前,他们说使用指令(因此在测试中使用$compile)来进行DOM操作。这仍然是事实,我认为即使是w/组件。如果需要测试DOM是否被正确操作,则需要使用指令和$compile。我现在倾向于创建组件,很少使用DOM级测试b/c。它可能很麻烦,而且通常不是任务关键型逻辑。除非您计划从AngularJS迁移到AngularJS(是的,它们是不同的),否则您不应该标记
Angular
(特别是因为我在大约$componentController中没有看到任何引用。嘿,有帮助吗?有什么不清楚的吗?谢谢你的回答!我看到很多人重复你的观点,即“几乎不可能有bug”在UI中。但对我来说,这似乎不是真的。我在UI中使用角度内置指令,显然不需要单独测试,但这些指令与我自己的模板和控制器的结合难道不值得测试吗?@benjyblack,IMHO,可能需要对执行技巧的自定义指令进行一些测试y DOM操作,但除此之外,大多数测试都应以控制器中的业务逻辑为目标。