web-dev-qa-db-ja.com

スパイの戻り値をテストする

Ionicアプリを開発しています。calling関数を使用すると、ユーザーは_factory.call_で番号を呼び出すことができます。

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

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

これは上記のジャスミンテストです。

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

上記のテストは問題なく通過しますが、factory.calling()が返す正確な値はテストしません。私は運が悪いのに以下を試しました。

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").

6
Aaron

まず、あなたのファクトリーは何も返しません:

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

割り当てである$ window.location.hrefへの呼び出しは何も返しません。その呼び出しはそこにあるべきではなく、あなたのメソッドは次のようでなければならないようです:

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

このようにすると、戻り値があります。また、テストできる場所に返された値を保存していません。通常、次のように、スパイを使用して、メソッドが呼び出されたかどうかを確認します。

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

メソッドが返す結果を確認するには、次のように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);
});

または、最初に呼び出してから、次のように返される値を確認できます。

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

また、このタイプのテストはデータベースにヒットしてはならないため、指定した固定データを使用してテストすることをお勧めします。また、常に(あなたがやったように)OAPTに固執する必要があります。

8
MBielski

まだこれが必要かどうかはわかりませんが、コール情報には「returnValue」プロパティが含まれています。したがって、次のようにテストできます:expect($ scope.isFilterError.calls.first()。returnValue).toBeFalsy();

13
Maksim Gumerov