0

httpBackend.when() からどのように約束を返しますか? .json ファイルに格納されている既定のデータをロードし、それを httpBackend.whenGET() から返したいと思いました。http.get('mydata.json') から promise を返そうとすると、ファクトリの失敗コールバックに応答が返されます。

function getAvailablePackagesComplete(response) {
    return response.data;
}

function getAvailablePackagesFailed(error) { // {error = Object {data: undefined, status: 0, config: Object, statusText: ""}
    $log.error(error.data.description);
    return false;
}

function getAvailablePackages() {
    return $http.get('/1.0/get-available-packages')
    .then(getAvailablePackagesComplete)
    .catch(getAvailablePackagesFailed)
}


var data = {"package": "test", "version": "1"}
$httpBackend.whenGET('/1.0/get-available-packages').respond(function(method, url, data) {
    // return [200,data, {}] // this works
    return $http.get('app/home/fixtures/mydata.json'); // contains {"package: "test", "version": "1"}
}); //this doesn't work
4

3 に答える 3

0

現在のところ、$httpBackend (ngMockE2E から) はその中の promise をサポートしていませ.respond- AngularJS GitHub Issue #11245を参照してください。実際$httpBackend の HTTP リクエストの作成を避けるために使用する必要がありますが、一部のリクエストを通過させることができます。

AngularJS ドキュメントから:

この実装は、when API とそのショートカット (whenGET、whenPOST など) を介して静的または動的な応答で応答するために使用できます。また、オプションで、特定の要求(たとえば、特定のリモート API と対話するため、またはフェッチするため) に対して実際の $httpBackend に要求を渡すことができます。テンプレート)。

ただし、やろうとしていることを回避するにはgetAvailablePackages()、json ファイル パスの HTTP GET を返して、$httpBackend.whenGET('pathTo.json').passThrough();

于 2015-10-22T00:48:57.147 に答える
0

私は同じ問題に直面していました。ユースケースは、他の人がオフラインで作業して UI を開発できるように、JS で API 全体のモックを作成していました。

これを実現するために、 Angular-mocks-asyncというプラグインを開発しました。このプラグインは、httpBackend を装飾し、.whenAsync( ) API を追加します。次のように、応答を簡単にモックして約束を返すことができます。

var app = ng.module( 'mockApp', [
    'ngMockE2E',
    'ngMockE2EAsync'
]);

app.run( [ '$httpBackend', '$q', function( $httpBackend, $q ) {

    $httpBackend.whenAsync(
        'GET',
        new RegExp( 'http://api.example.com/user/.+$' )
    ).respond( function( method, url, data, config ) {

        var re = /.*\/user\/(\w+)/;
        var userId = parseInt(url.replace(re, '$1'), 10);

        var response = $q.defer();

        setTimeout( function() {

            var data = {
                userId: userId
            };
            response.resolve( [ 200, "mock response", data ] );

        }, 1000 );

        return response.promise;

    });

}]);
于 2016-09-14T20:47:41.823 に答える