2013-03-20 11 views
7

私は単純なコントローラを持っています。まず、スコープに値を代入する必要があります。

function TestCtrl($scope, $http) { 
    $scope.listForms = 'some list'; 
} 

コントローラについては、次のテストが期待通りに動作します:

describe('Testing a controller', function() { 

    var ctrl, scope, httpMock; 

    beforeEach(inject(function($injector) { 
     scope = $injector.get('$rootScope').$new(); 
     ctrl = $injector.get('$controller'); 
     ctrl(TestCtrl, { $scope: scope }); 
    })); 

    it("assigns to scope", function() { 
     expect(scope.listForms).toMatch("some list"); 
    }); 
}); 

をしかし、私は私のAPI

function TestCtrl($scope, $http) { 
    $http.get('/api/listForms').success(function(list) { 
    $scope.aListOfForms = 'some list'; 
    }); 
} 

への試験変更からリストを取得する機能を変更したとき
describe('Testing a controller', function() { 

    var ctrl, scope, httpMock; 

    beforeEach(inject(function($injector) { 
     httpMock = $injector.get('$httpBackend'); 

     scope = $injector.get('$rootScope').$new(); 
     httpMock.when('GET', '/tactical/api/listOrderForms').respond("an order form"); 

     ctrl = $injector.get('$controller'); 
     ctrl(TestCtrl, { 
      $scope: scope, 
      $http: httpMock 
     }); 
    })); 

    it("gets the list from the api and assigns it to scope", function() { 
     httpMock.expectGET('tactical/api/listOrderForms'); 
     expect(scope.orderFormList).toMatch("an order form"); 
     httpMock.flush(); 
    }); 
}); 

geg次のエラー:

TypeError: 'undefined' is not a function 
Expected undefined to match 'an order form'. 
Error: No pending request to flush ! 

私が間違っていることを知っている人はいますか?前もって感謝します。

答えて

8

$ httpは、外部リソースと通信するために$httpBackendを使用します。あなたは$httpBackendを嘲笑しましたが、コントローラはまだそれを使って話をする必要があります$httpのインターフェイスです。

これはそれを行う必要があります。

describe('Testing a controller', function() { 

    var ctrl, scope, httpMock; 

    beforeEach(inject(function($controller, $rootScope, $httpBackend) { 
     httpMock = $httpBackend; 

     scope = $rootScope.$new(); 
     httpMock.when('GET', '/tactical/api/listOrderForms').respond("an order form"); 

     ctrl = $controller; 
     ctrl(TestCtrl, { 
      $scope: scope 
     }); 
    })); 

    it("gets the list from the api and assigns it to scope", function() { 
     httpMock.expectGET('tactical/api/listOrderForms'); 
     httpMock.flush(); 
     expect(scope.orderFormList).toMatch("an order form"); 
    }); 
}); 
+0

ありがとうそれは本当に助けになりました、私は愚かです。 –

+0

しかし、$ httpBackendの実際の実装は変更されていません。だから、Angularは実際の$ httpBackendオブジェクトにあるメソッド(何でも)を呼び出さないで、$ http.get()が呼び出されたときにhttpMockを呼び出す方法を知っていますか?私はここでひどく混乱しています。(Angularに新しくなりました) – Nikhil

+1

Nikhil、$ httpは$ httpが初期化されると$ httpBackendを要求します。 $ httpBackendはシングルトン(インスタンスは1つしか存在しません)であり、httpMockはそのインスタンスへの参照です。テストと$ httpの間で共有されるこの$ httpBackendインスタンスでコールバックを登録して何かをすることが、この作業をするためのものです。 –

0

expect()の前にhttpMock.flush()を呼び出す必要があります。 flush呼び出しは、http要求にバインドされたsuccess関数を呼び出す "バックエンド"から返される応答をシミュレートします。

+0

を私はフラッシュ(その理由を実現していない)が最初に行かなければならなかったので、私は何か、疲れて両方の方法を学んだと私はまだ同じエラーを取得します。 –

3

コントローラの$ httpBackendサービスを手動で$ httpサービスに置き換えることはできません。それが動作するはずです

ctrl(TestCtrl, { 
     $scope: scope, 
     $http: httpMock 
    }); 

ctrl(TestCtrl, { 
     $scope: scope 
    }); 

変更。

関連する問題