是否可以在类私有方法上使用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();
});
});
提前致谢
答案 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();
为避免有关通过字符串文字访问对象的棉绒警告,请创建间谍对象的局部常量。