1

angular アプリの単体テストを書き始めました。ただし、コントローラーの初期化とテストに多くの定型コードを使用しているように思えます。

この単体テストでは、関数の実行時にスコープからのモデルが Api に送信されるかどうかをテストします。

これには 20 行のコードが必要でした。これにより、1 つのことだけを行う単体テストを作成するのが不便になります。コードサイズをより小さなチャンクにするためのヒントはありますか?

これは私の現在の単体テストです:

'use strict';

describe('controllers', function(){
    beforeEach(module('kronos'));

    describe('CustomerSignupCtrl', function() {
        it('should send customer to Api on submit', inject(function($controller) {
            var scope = {};
            var $location = {};
            var Api = {
                signupCustomer: function(customer) {
                    expect(customer).toEqual({attrs: "customerdata"});
                    return {
                        success: function() { return this; },
                        error: function() { return this; }
                    };
                }
            };
            var ctrl = $controller('CustomerSignupCtrl', {
                $scope: scope,
                $location: location,
                Api: Api});
            scope.customer = {attrs: "customerdata"};
            scope.signup();
        }));
    });
});

特に気に入らないのは以下の点

  • すべての依存関係を初期化する必要があり、それらを使用するかどうかは問題ではありません
  • API は、コントローラーが promise を期待しているため、必要なだけの promise を返します
  • コントローラーを初期化する必要があります。

このコードをより短く、より明示的にするにはどうすればよいですか?

編集$location:この単体テストのサービスを無視できることに気付きました。すばらしい Edit2 : angular-appについて知りました。これは、優れた実践例のアプリとして機能します。そこにはjasmineの仕様があり、とてもよく書かれています。

4

2 に答える 2

0

コードを大幅に短縮することはできません。初期化、モッキング、アサーションなどは、どこかで行う必要があります。ただし、初期化コードとテスト コードを分離することで、コードの可読性を向上させることができます。このようなもの:

describe('CustomerSignupCtrl', function(){

  var controller, scope, location, api;

  beforeEach(module('kronos'));

  // initialization
  beforeEach(inject(function($controller, $rootScope, $location, Api){
    scope = $rootScope.$new();
    location = $location;
    api = Api;
    controller = $controller('CustomerSignupCtrl', {
      $scope: scope, $location: location, Api: api});
  }));

  // test
  it('should send customer to Api on submit', function() {
    scope.customer = {attrs: "customerdata"};
    spyOn(api,'signupCustomer').andCallFake(function(customer) {    
      return {
        success: function() { return this; },
        error: function() { return this; }
      };
    });
    scope.signup();
    expect(api.signupCustomer).toHaveBeenCalledWith(scope.customer);
  });

});
于 2013-09-20T23:07:56.970 に答える