我有一个服务,我正在尝试单元测试但是我无法访问服务中的功能,这些功能应该只对该模块是私有的。为了测试它并将间谍放在上面,我必须将该函数暴露给其他模块。我觉得这会破坏封装的目的,并且是禁止编码的。
例如,这四个函数是辅助函数,除了它之外的任何其他模块都不使用它们。将它放在' vm'中是绝对没有意义的。被实例化为'这个'为了惯例。这会将其暴露给其他要使用的模块。我不想要这个。但是,如果我的测试失败,因为我的茉莉花测试无法访问它们。 :
解决方案是将我想要测试的所有函数公开给所有其他模块,以便它们可以进行单元测试,或者有一种方法可以从我的测试中访问这些变量,而不会将它们暴露给所有内容。
答案 0 :(得分:1)
正如您所说,在单元测试期间不应直接测试私有函数。
如果它们在service
中是私有的,则表示它们在同一service
内被调用。
所以测试它们的地方就是测试调用它们的公开函数。
他们将对服务,返回值等执行操作,因此您应该只测试“主要公开方法”,并在describe
块中测试私有函数的行为是否正确。
正如你所说,nope解决方案不是暴露所有。在服务,工厂或控制器。无论。
这不仅与JS和/或Angular有关,这是单元测试的标准做法。
一个简短的例子。
假设您在公开的服务中有一个函数,称为function1
。
在这个方法中你调用另一个私有函数,称为function2
,它负责设置service
的属性(假设它增加了服务公开的计数器)。
因此,在function2
内测试function1
的位置。
在与describe
相关的function1
块中,您添加了与function2
相关的另一个块,并在调用function1
后添加测试以查看计数器属性是否已增加。