2016-09-14 9 views
1

私はサービスを呼び出し、いくつかの変数を設定するコントローラを持っています。これらの変数が応答に設定されることをテストしたい。

マイコントローラー:

tankService.getCurrentStats().success(function (response) { 
      $scope.stats.tankAvgHours = response.tankAvgHours; 
      $scope.stats.stillAvgHours = response.stillAvgHours; 
      $scope.stats.stillRemaining = response.stillRemaining; 
      $scope.stats.tankRemaining = response.tankRemaining; 
      $scope.stats.loaded = true; 
    }); 

私のテスト:

... 
var STATS_RESPONSE_SUCCESS = 
      { 
       tankAvgHours:8, 
       stillAvgHours:2, 
       stillRemaining: 200, 
       tankRemaining:50 
      }; 
... 

spyOn(tankService, "getCurrentStats").and.callThrough(); 

... 

it('calls service and allocates stats with returned data', function() { 

      expect($scope.stats.loaded).toBeFalsy(); 

      $httpBackend.whenPOST('../services/tanks/RelayTankService.asmx/getCurrentStats').respond(200, $q.when(STATS_RESPONSE_SUCCESS)); 

      tankService.getCurrentStats() 
       .then(function(res){ 
        result = res.data.$$state.value; 
       }); 

      $httpBackend.flush(); 


      expect($scope.stats.tankAvgHours).toEqual(result.tankAvgHours); 
      expect($scope.stats.stillAvgHours).toEqual(result.stillAvgHours); 
      expect($scope.stats.stillRemaining).toEqual(result.stillRemaining); 
      expect($scope.stats.tankRemaining).toEqual(result.tankRemaining); 
      expect($scope.stats.loaded).toBeTruthy(); 

     }); 

結果は私のスコープ変数は定義されていませんし、私の嘲笑応答データを等しくしていないということです。私は成功関数をテストすることができますので、変数を正しく入力する虚偽の値を渡すことは可能ですか?

ありがとうございます!

答えて

1

あなたは、コントローラをテストしているので、$httpPOSTモックする必要はありませんあなたがテストでやったやり方。

tankServicegetCurrentStatsメソッドをモックするだけです。

describe('controller: appCtrl', function() { 
 
    var $scope, tankService, appCtrl; 
 

 
    var response = { 
 
    tankAvgHours: 8, 
 
    stillAvgHours: 2, 
 
    stillRemaining: 200, 
 
    tankRemaining: 50 
 
    }; 
 

 
    beforeEach(module('myApp')); 
 

 
    beforeEach(inject(function($controller, $rootScope, _tankService_) { 
 
    $scope = $rootScope.$new(); 
 
    tankService = _tankService_; 
 

 
    spyOn(tankService, 'getCurrentStats').and.callFake(function() { 
 
     return { 
 
     then: function(successCallback) { 
 
      successCallback(response); 
 
     } 
 
     } 
 
    }); 
 

 
    AdminController = $controller('appCtrl', { 
 
     $scope: $scope, 
 
     tankService: _tankService_ 
 
    }); 
 
    })); 
 

 
    describe('appCtrl initialization', function() { 
 
    it('calls service and allocates stats with returned data', function() { 
 
     expect(tankService.getCurrentStats).toHaveBeenCalled(); 
 
     expect($scope.stats.tankAvgHours).toEqual(response.tankAvgHours); 
 
     expect($scope.stats.stillAvgHours).toEqual(response.stillAvgHours); 
 
     expect($scope.stats.stillRemaining).toEqual(response.stillRemaining); 
 
     expect($scope.stats.tankRemaining).toEqual(response.tankRemaining); 
 
     expect($scope.stats.loaded).toBeTruthy(); 
 
    }); 
 
    }); 
 
});

・ホープ、このことができます:

あなたtankServicegetCurrentStats方法は約束を返すと仮定すると、これはあなたのテストがでなければならない方法です。

+0

不思議なことに、私はテストに関して他の投稿を読んでいました。私はこれを理解しようとしていました。私はあなたが私を正しい軌道に乗せたと思うが、私はまだ誤りがある。 TypeError:未定義のプロパティ 'tankAvgHours'を読み取ることができません – enfrost

+0

私は、データを追加する必要がありました。嘲笑されたレスポンスオブジェクトにはうまくいきました。そんなにシッダースありがとう! – enfrost

+0

恐ろしい!お力になれて、嬉しいです。 –

1

あなたは間違ったことをテストしていると思います。サービスは、データのみを返す責任があります。サービスをテストする場合は、httpbackendをモックしてサービスを呼び出しますが、$ scopeではなくサービスから返されたデータを確認します。コントローラがサービスを呼び出してスコープにデータを追加することをテストする場合は、テストでコントローラを作成し、作成したスコープを与え、それらの変数が追加されることをテストする必要があります。構文がオフになる場合もありますので、私はこれをテストしていないが、これはおそらく、あなたが行きたい方向である。

var scope, $httpBackend, controller; 
    beforeEach(inject(function(_$httpBackend_, $controller, $rootScope) { 
    $httpBackend = _$httpBackend_; 
    $httpBackend.whenPOST('../services/tanks/RelayTankService.asmx/getCurrentStats').respond(200, $q.when(STATS_RESPONSE_SUCCESS)); 
    scope = $rootScope.$new(); 
    controller = $controller('myController', { 
     $scope: scope 
    }); 


    })); 
it('calls service and allocates stats with returned data', function() { 

      expect(scope.stats.loaded).toBeFalsy(); 
      $httpBackend.flush(); 
      expect(scope.stats.tankAvgHours).toEqual(result.tankAvgHours); 
      expect(scope.stats.stillAvgHours).toEqual(result.stillAvgHours); 
      expect(scope.stats.stillRemaining).toEqual(result.stillRemaining); 
      expect(scope.stats.tankRemaining).toEqual(result.tankRemaining); 
      expect(scope.stats.loaded).toBeTruthy(); 

     }); 
+0

ありがとうございますMorningDew、私はそれを試してみましょう。私はあなたが言ったことをかなりやっていると思う(作成されたコントローラ)、唯一のことはコントローラscope $ scopeに$ scopeを渡すことで、rootスコープから新しいスコープを作成するのではなく、コントローラテストでサービスを呼び出した。私はあなたがサービスを呼び出す必要はないと言って、何とか成功した$ httpコールの結果を確認することができると言っていると思います。 – enfrost

関連する問題