Jasmine中and.stub与and.callFake的区别是什么?

时间:2018-03-18 06:18:07

标签: unit-testing jasmine karma-jasmine

我是Jasmine的新手,并且在上述两个功能之间有点混淆。我唯一的目的是为间谍功能提供假实现。但是,如果我将调试器放在callFake中,则会调用它,但and.stub的函数不会被调用。任何人都可以解释这两个功能之间的区别。

spyOn(manager, 'getUsers').and.stub(function () {
    //to do
});

VS

 spyOn(manager, 'getUsers').and.callFake(function () {
        //to do
    });

2 个答案:

答案 0 :(得分:1)

查看位于https://jasmine.github.io/2.0/introduction.html#section-Spies的文档,当您spyOn记录在spied on object方法上进行的所有调用时。这意味着它正在调用对象的实际方法,但是跟踪所做的调用。

如果您想允许使用原始对象,但不希望调用特定方法,则可以选择使用and.callFakeand.stub。差异在方法签名中。

callFake将函数作为参数。这允许你伪造方法调用并返回你想要的值。

原始方法签名为myMethod(param1: string): string

spyOn(service, 'myMethod').and.callFake((param1) => {
    expect(param1).toBe('value');
    return 'returnValue';
});

stub没有参数,只是拦截对方法的调用

spyOn(service, 'myMethod').and.stub();

myMethod可以有参数并且可以有返回类型,但是没关系,因为存根只是拦截了调用,如果有返回类型,它将返回null

在这两个实例中,都会记录方法调用,然后您可以执行expect(service.myMethod).toHaveBeenCalled()expect(service.myMethod).toHaveBeenCalledWith('value')

之类的操作

答案 1 :(得分:0)

What's the difference between faking, mocking, and stubbing?可能重复。

在那里你会找到一个简洁的答案,包括所有的差异。