Javascript 使用createSpyObj创建spy时调用通不工作

Javascript 使用createSpyObj创建spy时调用通不工作,javascript,angular,typescript,jasmine,karma-jasmine,Javascript,Angular,Typescript,Jasmine,Karma Jasmine,当使用createSpyObj创建spy对象时,and.callThrough似乎并没有实际运行原始实现。例如,假设我有一个Angular service,它具有以下帮助器方法: user.service.ts: 在规范中,我使用createSpyObj创建了一个间谍: user.service.specs.ts 第二次尝试: userServiceSpy.getFullName = UserService.prototyp.getFullName; // This is a compile e

当使用createSpyObj创建spy对象时,and.callThrough似乎并没有实际运行原始实现。例如,假设我有一个Angular service,它具有以下帮助器方法:

user.service.ts:

在规范中,我使用createSpyObj创建了一个间谍:

user.service.specs.ts

第二次尝试:

userServiceSpy.getFullName = UserService.prototyp.getFullName; // This is a compile error. 
我们需要使用callFake并使用原型中的函数实现,如下所示:

userServiceSpy.getFullName.and.callFake(UserService.prototype.getFullName);
我们需要使用callFake并使用原型中的函数实现,如下所示:

userServiceSpy.getFullName.and.callFake(UserService.prototype.getFullName);


不,没有。您正在调用spy对象,没有真正的实现可调用。如果不想存根或调用假函数,为什么要创建Spyobj?您似乎在尝试测试一个模拟,这是毫无意义的。在调用spy对象的getFullName时,我如何使用主实现?当您从实际实现开始窥探时,通常使用callThrough。现在还不清楚你到底想在这里测试什么,所以很难说什么是合适的解决方案。@jonrsharpe我不知道你为什么坚持要删除标题。它使它更具可读性,将实际问题与示例或描述分开。所以ppl不会对回答什么感到困惑。请把它们带回来。感谢其他编辑,尽管标题对可读性没有任何帮助,但它们只是妨碍了对问题的浏览-例如,你不需要一个示例标题紧接着一个示例,或者一个问题标题紧接着一个带问号的句子,或者最明显的是,我尝试了一个标题,紧接着我尝试了……不,没有。您正在调用spy对象,没有真正的实现可调用。如果不想存根或调用假函数,为什么要创建Spyobj?您似乎在尝试测试一个模拟,这是毫无意义的。在调用spy对象的getFullName时,我如何使用主实现?当您从实际实现开始窥探时,通常使用callThrough。现在还不清楚你到底想在这里测试什么,所以很难说什么是合适的解决方案。@jonrsharpe我不知道你为什么坚持要删除标题。它使它更具可读性,将实际问题与示例或描述分开。所以ppl不会对回答什么感到困惑。请把它们带回来。感谢其他编辑,尽管标题对可读性没有任何帮助,但它们只是妨碍了对问题的浏览-例如,你不需要一个示例标题紧接着一个示例,或者一个问题标题紧接着一个带问号的句子,或者可能最明显的是一个我尝试过的标题,紧接着是我尝试过的……但这让人困惑,因为您调用的伪实现实际上是真实的。给下一个人留下这样一个脚枪。在您的示例中,您可以调用真正的实现,spy对象是完全冗余的。@jonrsharpe服务和Spie还有其他功能。这个getFullName方法是一种助手方法。其他方法,也调用getFullName,所以重点是我想模拟其他方法,同时保留getFullName的主要实现,这听起来是个坏主意。再说一次:如果没有上下文,很难说好主意是什么。虽然参加晚会很晚,但Google让我想到了这一点:一个潜在的有效案例是当你想测试一个抽象基类,它有一个带有代码的方法。您可以使用createSpyObj模拟该基类的实例,并使用此答案中概述的方法来模拟,而无需创建存根派生类或依赖实际派生类来模拟@jonrsharpeThat令人困惑,因为您调用的伪实现实际上是真实的。给下一个人留下这样一个脚枪。在您的示例中,您可以调用真正的实现,spy对象是完全冗余的。@jonrsharpe服务和Spie还有其他功能。这个getFullName方法是一种助手方法。其他方法,也调用getFullName,所以重点是我想模拟其他方法,同时保留getFullName的主要实现,这听起来是个坏主意。再说一次:如果没有上下文,很难说好主意是什么。虽然参加晚会很晚,但Google让我想到了这一点:一个潜在的有效案例是当你想测试一个抽象基类,它有一个带有代码的方法。您可以使用createSpyObj模拟该基类的实例,并使用此答案中概述的方法来模拟,而无需创建存根派生类或依赖实际派生类来模拟@琼尔夏普
userServiceSpy.getFullName = UserService.prototyp.getFullName; // This is a compile error. 
userServiceSpy.getFullName.and.callFake(UserService.prototype.getFullName);