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();
    });
});

次のエラーが発生します。

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

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

4

3 に答える 3

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");
    });
});
于 2013-04-20T12:47:53.637 に答える
3

コントローラの$httpBackendサービスとして$httpサービスを手動で置き換えることはできません。

変化する

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

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

動作するはずです。

于 2013-04-02T00:13:56.320 に答える
0

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

于 2013-03-20T20:36:10.323 に答える