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

时间:2017-12-30 01:37:00

标签: javascript angularjs unit-testing jasmine

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

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

如果它们在service中是私有的,则表示它们在同一service内被调用。

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

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

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

一个简短的例子。

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

因此,在function2内测试function1的位置。 在与describe相关的function1块中,您添加了与function2相关的另一个块,并在调用function1后添加测试以查看计数器属性是否已增加。