2

CORShttpServiceこれは基本的にサービスのラッパーですが、$http必要な CORS 機能をカプセル化しています。私は現在、CORShttpService注入されたサービスのテストをいくつか書いています。このサービスには次のようなコードがあります。

CORShttpService({method: requestMethod, url: getUrl(path), data: data}).
    success(function(data, status, headers) {
        //do success stuff
    }).
    error(function(data, status, headers) {
       //do error stuff
    });

への呼び出しをモックしたいのですがCORShttpService、それを行う方法がわかりません。私はジャスミンを使用しています。そのspyOn関数には、オブジェクトの関数をモックするためのオブジェクトが必要です。私CORShttpServiceはどのオブジェクトにも添付されていないので、それをモックする方法がわかりません。はい、$httpBackend最終的に に設定されるリクエストをモックするために使用できますCORShttpServiceが、そもそもそのサービスに入ってほしくありません。単体テストを分離し、外部呼び出しを単純にモックしたいと考えています。単なる関数であるこのサービスをモックする方法はありますか?

4

2 に答える 2

7

これについてさらに考えてみると、$httpBackendサービスはリクエストをテストするための多くの機能を提供します。myCORShttpServiceは基本的に のラッパーであるため、シンプルな$http実装のモック実装を作成すれば、おそらく費用対効果が最も高いと判断しました。このドキュメントを使用して私を助けてください。私の仕様には次のものがあります。CORShttpService$http

beforeEach(module(function($provide) {
    $provide.provider('CORShttpService', function() {
        this.$get = function($http) {
            return $http;
        };
    });
}));

そのため、注入が必要なサービスはすべて、CORShttpService基本的には注入されているだけなので、それ自体にある余分な機能を気にせずに$httpすべての機能を使用できます。$httpBackendCORShttpService

これは私の特定のケースで機能しますが、単なる関数であるサービスをモックするための一般的なソリューションに関してはjasmine.createSpy、zbynour の回答で述べたように、おそらく同じ種類のことを行うことができます。何かのようなもの:

beforeEach(module(function($provide) {
    $provide.provider('MyService', function() {
        this.$get = function() {
            return jasmine.createSpy("myService");
        };
    });
}));
于 2013-01-28T19:08:36.587 に答える
2

はい、あなたが書いspyOnたように関数をスタブできますが、既存のオブジェクトのプロパティでなければなりません。また、ユニットを分離する方が良いことに同意します。:)

必要なのはjasmine.createSpy. これにより、裸のスパイを作成し、その動作を通常どおりに定義できます ( 、 などを使用andReturn) andCallFake

以下のコードのようなもの( も含むjasmine.createSpyObj)クラウドがあなたが望むものになると思います:

it ('should do sth', function() {

    var res = jasmine.createSpyObj('res', [ 'success', 'error' ]);
    res.success.andReturn(res);
    res.error.andReturn(res);
    var corsHttpService = jasmine.createSpy().andReturn(res);

    // call the service using corsHttpService
    anotherService(corsHttpService);

    // assert
    expect(corsHttpService).toHaveBeenCalledWith({
        method: requestMethod, 
        url: url,
        data: data});
    expect(res.success).toHaveBeenCalledWith(jasmine.any(Function));
    expect(res.error).toHaveBeenCalledWith(jasmine.any(Function));
});

単純ではなく、さらに先に進みたい場合

res.success.andReturn(res);

渡されたコールバックを保存できます

var succCallback;
res.success.andCallFake(function(callback) {
        succCallback = callback;
        return res;
    });

仕様の後半では、コールバックを呼び出して、次の成功結果をエミュレートできますcorsHttpService

succCallback('a-data', 'a-status', 'a-header');

次に、テスト済みサービスの「成功したもの」をテストすることが可能です...

于 2013-01-26T12:04:59.977 に答える