在私人方法上使用Jasmine spyon

时间:2011-12-12 14:09:45

标签: javascript unit-testing jasmine

是否可以在类私有方法上使用Jasmine单元测试框架的spyon方法?

文档给出了这个例子,但这可以灵活用于私有函数吗?

describe("Person", function() {
    it("calls the sayHello() function", function() {
        var fakePerson = new Person();
        spyOn(fakePerson, "sayHello");
        fakePerson.helloSomeone("world");
        expect(fakePerson.sayHello).toHaveBeenCalled();
    });
});

提前致谢

9 个答案:

答案 0 :(得分:66)

只需添加通用参数<任何> spyon()函数:

 spyOn<any>(fakePerson, 'sayHello');

完美无缺!

答案 1 :(得分:13)

spyOn<any>(fakePerson, 'sayHello');
expect(fakePerson['sayHello']).toHaveBeenCalled();

通过将<any>添加到spyOn,可以将其从打字稿类型检查中删除。 您还需要使用数组索引符号来访问测试期望中的私有方法(sayHello)

答案 2 :(得分:3)

如果你对你的对象使用Typescript,那么这个函数并不是非常私密的 您只需保存从spyOn调用返回的值,然后查询它的calls属性。

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

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();
    });
});

答案 3 :(得分:3)

Typescript被编译为javascript,在javascript中每个方法都是公共的。因此,您可以使用数组索引表示法来访问私有方法或文件,即:

Object['private_field']

有关详细信息,请访问following blog

答案 4 :(得分:2)

因为您无法访问实例上下文之外的私有函数。

顺便说一句,窥探想要测试的物体并不是一个好主意。当您测试是否要调用您要测试的类中的特定方法时,它什么也没说。让我们说你写了测试并且它通过了,两周后你重构了函数中的一些东西并添加了一个bug。所以你的测试仍然是绿色的,因为你调用了这个函数。乙

使用Dependency Injection时,间谍非常有用,其中所有外部依赖项都由构造函数传递,而不是在类中创建。所以假设你有一个需要dom元素的类。 Normaly你会在类中使用jquery选择器来获取这个元素。但是你想如何测试那个元素呢?当然你可以将它添加到你的测试页面html。但是你也可以调用你的类在构造函数中传递元素。这样做,您可以使用间谍来检查您的类是否按预期与该元素进行交互。

答案 5 :(得分:2)

假设sayHello(text: string)是私有方法。您可以使用以下代码:

// Create a spy on it using "any"
spyOn<any>(fakePerson, 'sayHello').and.callThrough();

// To access the private (or protected) method use [ ] operator:
expect(fakeperson['sayHello']).toHaveBeenCalledWith('your-params-to-sayhello');
  • 使用any监视私有方法。
  • 要使用私有(或受保护)方法,请使用[]运算符。

答案 6 :(得分:0)

如果要在类中测试私有函数,为什么不在类中添加一个构造函数来表示返回那些私有函数?

请仔细阅读以了解我的意思:http://iainjmitchell.com/blog/?p=255

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

答案 7 :(得分:0)

就我而言(打字稿):

jest.spyOn<any, string>(authService, 'isTokenActual')

或具有模拟结果:

jest.spyOn<any, string>(authService, 'isTokenActual').mockImplementation(() => {
  return false;
});

答案 8 :(得分:0)

const spy = spyOn<any>(component, 'privateMethod');
expect(spy).toHaveBeenCalled();

为避免有关通过字符串文字访问对象的棉绒警告,请创建间谍对象的局部常量。