如何封装AngularJS函数但仍然可以测试它

问题描述 投票:0回答:1

我有一个服务,我试图进行单元测试但是我无法获得服务中的功能,这些功能应该仅对该模块是私有的。为了测试它并将间谍放在上面,我必须将该函数暴露给其他模块。我觉得这会破坏封装的目的,并且是禁止编码的。

例如,这四个函数是辅助函数,除了它所在的模块之外不被任何其他模块使用。将它放在'vm'对象中绝对没有意义,该对象被实例化为'this'用于约定。这会将其暴露给其他要使用的模块。我不想要这个。但是,如果我没有,我的测试失败,因为我的茉莉花测试无法访问它们。 :

enter image description here

解决方案是将我想要测试的所有函数暴露给我所有其他模块,以便它们可以进行单元测试,或者有一种方法可以从我的测试中访问这些变量而不会将它们暴露给所有内容。

javascript angularjs unit-testing jasmine
1个回答
1
投票

如您所述,在单元测试期间不应直接测试私有函数。

如果他们在service中是私人的,那就意味着他们被称为同一个service

所以测试它们的地方就是测试调用它们的公开函数。他们将对服务,返回值等执行操作,因此您应该只测试“主要暴露方法”,并在describe块中测试私有函数的行为是否正确。

正如你所说,nope解决方案不是暴露所有。在服务,工厂或控制器。无论。

这不仅与JS和/或Angular有关,这是单元测试的标准做法。

一个简短的例子。

假设您在服务中有一个被公开的函数,称为function1。在这个方法中,你调用另一个私有函数,称为function2,它负责设置service的属性(假设它增加了服务公开的计数器)。

所以测试function2的地方是在function1内。在与describe相关的function1块中,添加另一个与function2相关的块,并添加一个测试,以查看在调用function1后是否增加了counter属性。

© www.soinside.com 2019 - 2024. All rights reserved.