using Jasmines spyon upon a private method
是否可以在类私有方法上使用Jasmine单元测试框架的spyon方法?
文档给出了这个例子,但这可以灵活用于私有函数吗?
1 2 3 4 5 6 7 8 | describe("Person", function() { it("calls the sayHello() function", function() { var fakePerson = new Person(); spyOn(fakePerson,"sayHello"); fakePerson.helloSomeone("world"); expect(fakePerson.sayHello).toHaveBeenCalled(); }); }); |
提前致谢
只需在spyon()函数中添加一个通用参数
1 | spyOn(fakePerson, 'sayHello'); |
它完美地工作!
Typescript被编译为javascript,并且在javascript中每个方法都是公共的。因此,您可以使用数组索引表示法来访问私有方法或文件,即:
1 | Object['private_field'] |
有关详细信息,请访问以下博客
如果你对你的对象使用Typescript,那么这个函数并不是真正的私有
您只需要保存从
最后这段代码应该适合你(至少它对我有用):
1 2 3 4 5 6 7 8 9 10 | describe("Person", function() { it("calls the sayHello() function", function() { var fakePerson = new Person(); // save the return value: var spiedFunction = spyOn(fakePerson,"sayHello"); fakePerson.helloSomeone("world"); // query the calls property: expect(spiedFunction.calls.any()).toBeFalsy(); }); }); |
不要因为您无法访问实例上下文之外的私有函数。
顺便说一下,窥探想要测试的物体并不是一个好主意。当您测试是否要调用您要测试的类中的特定方法时,它什么也没说。让我们说你写了测试并且它通过了,两周后你重构了函数中的一些东西并添加了一个bug。所以你的测试仍然是绿色的,因为你调用了这个函数。乙
使用依赖注入时,间谍非常有用,其中所有外部依赖项都由构造函数传递,而不是在类中创建。所以假设你有一个需要dom元素的类。 Normaly你会在类中使用jquery选择器来获取这个元素。但是你想如何测试那个元素呢?当然你可以将它添加到你的测试页面html。但是你也可以调用你的类在构造函数中传递元素。这样做,您可以使用间谍来检查您的类是否按预期与该元素交互。
在我的情况下(Typescript):
1 | jest.spyOn(authService, 'isTokenActual') |
或者与模拟结果:
1 2 3 | jest.spyOn(authService, 'isTokenActual').mockImplementation(() => { return false; }); |
如果要在类中测试私有函数,为什么不在类中添加一个构造函数来表示返回那些私有函数?
请仔细阅读以了解我的意思:http://iainjmitchell.com/blog/?p = 255
我一直在使用类似的想法,到目前为止它的工作很棒!