关于javascript:在私有方法上使用Jasmine spyon

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,那么这个函数并不是真正的私有
您只需要保存从spyOn调用返回的值,然后查询它的calls属性。

最后这段代码应该适合你(至少它对我有用):

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

我一直在使用类似的想法,到目前为止它的工作很棒!