Javascript 如何封装AngularJS函数但仍使其可测试
我有一个服务,我正在尝试进行单元测试,但是我无法访问服务中的功能,这些功能应该只对该模块专用。为了测试它并在上面部署间谍,我必须向其他模块公开该功能。我觉得这违背了封装的目的,是编码的禁忌 例如,这四个函数都是辅助函数,除它所在的模块外,其他模块都不使用它们。把它放在“vm”对象中是毫无意义的,该对象被实例化为“this”用于约定。这会将其公开给其他模块使用。我不要这个。但是,如果我不这样做,我的测试就会失败,因为我的jasmine测试无法访问它们Javascript 如何封装AngularJS函数但仍使其可测试,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,我有一个服务,我正在尝试进行单元测试,但是我无法访问服务中的功能,这些功能应该只对该模块专用。为了测试它并在上面部署间谍,我必须向其他模块公开该功能。我觉得这违背了封装的目的,是编码的禁忌 例如,这四个函数都是辅助函数,除它所在的模块外,其他模块都不使用它们。把它放在“vm”对象中是毫无意义的,该对象被实例化为“this”用于约定。这会将其公开给其他模块使用。我不要这个。但是,如果我不这样做,我的测试就会失败,因为我的jasmine测试无法访问它们 还有一种解决方案是将我想要测试的所有函数公开
还有一种解决方案是将我想要测试的所有函数公开给我的所有其他模块,这样它们就可以进行单元测试,或者有没有一种方法可以从我的测试中访问这些变量,而不必将它们公开给所有的模块。正如你所说,在单元测试期间不应该直接测试私有函数 如果它们在该
服务
中是私有的,则表示它们在同一服务
中被调用
所以测试它们的地方,就是测试调用它们的公开函数的时候。
它们将对服务、返回值等执行操作,因此您只需测试“主公开方法”,并在description
块中测试私有函数的行为是否正确
正如你所说的,不,解决方案不是全部公开。在服务、工厂或控制器中。无论在哪里
这不仅仅与JS和/或Angular有关,这是单元测试的标准实践
一个简单的例子
假设您在公开的服务中有一个函数,名为function1
。
在这个方法中,您调用另一个私有函数,称为function2
,它负责设置服务的属性(假设它增加了服务公开的计数器)
所以测试function2
的地方就在function1
里面。
在与function1
相关的description
块中,您添加了另一个与function2
相关的块,并添加了一个测试,以查看调用function1
后计数器属性是否增加。啊,好的,我误解了单元测试。我认为它是将每个单独的功能作为一个“单元”单独进行测试,这意味着测试应该是原子的,所以每个测试应该涵盖一个方面。因此,如果您有一个设置值的函数,例如调用另一个外部函数,那么您应该实现两个不同的测试