测试 return 间谍值

Test return value of a spy

我正在开发 Ionic 应用程序。 calling 函数允许用户呼叫 factory.call 中的号码。

factory.call = '345-678-9087';

factory.calling = function(){
    return $window.location.href = 'tel:' + factory.call;
};

这是上面的 Jasmine 测试,

it('calling method', function(){
    spyOn(factory, 'calling');
    factory.calling();
    expect(typeof(windowMock.location.href)).toEqual('string');
});

上面的测试通过的很好,但是它没有测试factory.calling() returns的确切值。我尝试了以下但没有成功。

1)

it('calling method', function(){
    var emergency = spyOn(factory, 'calling');
    factory.calling();
    expect(emergency).toEqual("'tel:' + factory.call");
});

2) spyOn(factory, "calling").andCallThrough().

3) spyOn(factory, "calling").andReturn("'tel:' + factory.call").

首先,您的工厂没有return任何东西:

factory.calling = function(){
    return $window.location.href = 'tel:' + factory.call;
};

调用 $window.location.href 作为赋值不会 return 任何东西。在我看来,那个电话不应该在那里,你的方法应该是:

factory.calling = function(){
    return 'tel:' + factory.call;
};

这样做,你就有了一个 return 值。此外,您不会将 returned 的值存储在任何可以对其进行测试的地方。通常,您使用间谍来检查是否调用了该方法,如下所示:

it('calling method', function(){
    spyOn(factory, 'calling');
    factory.calling();
    expect(factory.calling).toHaveBeenCalled();
});

要检查方法 return 的内容,您可以在 expect 块中调用它,如下所示:

it('calling method', function(){
    expect(factory.calling()).toEqual('tel: ' + factory.call);
});

或者您可以像这样通过匿名函数调用它:

it('calling method', function(){
    expect(function(){return factory.calling();}).toEqual('tel: ' + factory.call);
});

或者您可以先调用它,然后检查它的值 return,如下所示:

it('calling method', function(){
    var result = factory.calling();
    expect(result).toEqual('tel: ' + factory.call);
});

我可能还建议您使用您提供的固定数据进行测试,因为这种类型的测试不应该访问数据库。另外,你应该始终坚持 OAPT(就像你所做的那样。)

不确定您是否还需要这个,但通话信息包含 "returnValue" 属性。 所以可以这样测试: 期望($scope.isFilterError.calls.first().returnValue).toBeFalsy();