2

わかりました、これは本当に奇妙な動作だと確信しています - そして何が起こっているのか分かりません...

以下のコード。

おそらくこれまでで最も単純な AngularJS コントローラーで Jasmine 仕様を実行しています。これは、初期化時に関数 (getSuppliers) を呼び出し、次に $httpBackend を使用してモックした http get 要求を作成します。実際にテストを実行すると、奇妙なことが起こります。で失敗しExpected undefined to equal 'list of suppliers'ます。

そのため、いくつかdebugger;の s (1 と 2) にとどまり、Chrome で仕様を実行しました。これは奇妙な部分です。Debugger 2 は Debugger 1 の前にヒットします。つまり、モックが魔法のように機能する前に、 getSuppliers 関数が の値を返しますundefined。記録として、続けてデバッガー 1 も起動すると、 data の値は の正しい値になります"list of suppliers"。そのため、モックを適切な場所で実行することができれば、私はうまくいくはずです。ここで一体何が起こっているのか、誰にも分かりませんか?

spec.js

describe("Supplier Controller", function(){
    ctrl = null;
    scope = null;
    httpBackend = null;
    supplierController = null;

    beforeEach(inject(function($controller,$rootScope,$httpBackend) {
        scope = $rootScope.$new();
        ctrl = $controller;
        httpBackend = $httpBackend;

        httpBackend.expectGET('/suppliers.json').respond("list of suppliers");
        supplierController = ctrl('supplierCtrl', { $scope: scope});
        $httpBackend.flush();
    }));

    it("gets a list of suppliers", function(){
        expect(scope.suppliers).toEqual( "list of suppliers" );
    });
});

サプライヤー.js

function supplierCtrl($scope, $http) {
    $scope.suppliers = getSuppliers($http);
}

function getSuppliers($http){
    var suppliers;
    $http.get('/suppliers.json').success(function(data) {
        debugger; // Debugger 1
        suppliers = data;
    }).error(function(){ suppliers = "something else"; } );
    debugger; // Debugger 2
    return suppliers;
};

知恵をありがとう...

4

0 に答える 0