1

私はすべてのコードを Karma と Jasmine に転送する過程にあり、どこから始めればよいかわかりません。

TDD の観点からビルドを開始した場合、このコードはどのように見えるでしょうか? 簡単なテストはどのように見えますか?

注: このコードは 100% 機能しますが、テストのセットアップはありません。

(function() {

    "use strict";

    angular.module('system_centers', [
        'system'
    ])

        .factory('System', ['Api', function(Api) {
            this.loadSystem = function(contactId, cardId) {
                return Api.get('lmc/contact/system/' + contactId, {
                    card_id: cardId
                });
            };

            this.completeSystem = function(recordId) {
                return Api.put('system/complete/' + recordId);
            };

            this.createSystem = function(contactId, cardId) {
                if (+contactId === 0 || +cardId === 0) {
                    return false;
                }

                return Api.post('contact/system/' + contactId, {
                    card_id: cardId,
                    type: 'systems',
                    origin: 'lmc'
                });
            };

            return this;
        }])

        .controller('System_centersCtrl', ['$scope', 'System', function($scope, System) {
            $scope.main.cardType = 'systems';
            $scope.main.type = 'system_centers';

            $scope.completeSystem = function(recordId) {
                System.completeSystem(recordId).success(function(){
                    toastr.success("System completed!");
                    $scope.createSystem();
                    $scope.loadSystems();
                });
            };

            $scope.createSystem = function() {
                System.createSystem($scope.main.contactId, $scope.main.cardId).success(function() {
                    $scope.loadSystem($scope.main.contactId, $scope.main.cardId);
                    $scope.loadContacts();
                });
            };

            $scope.loadSystem = function() {
                System.loadSystem($scope.main.contactId, $scope.main.cardId).success(function(data) {
                    if (data.error) {
                        $scope.createSystem();
                    } else {
                        $scope.main.record = data.record;
                    }
                });
            };

            $scope.loadSystems();
        }]);

})();
4

1 に答える 1

6

テストは簡単です。工場が正しく機能していることを確認するだけです。Apiこれは、テストに属するものを実際に取得/配置/投稿したいという意味ではありません。ここで知りたいのは、ファクトリの特定の関数を呼び出すApiと、正しいパラメーターでいくつかの関数が呼び出されることです。

それはモジュールApiに属していると思います。system私はそれをロードしてモックします:

beforeEach(module('system', function($provide) {
  api = {
    get: function(url, params) {},
    put: function(url, params) {},
    post: function(url, params) {}
  };

  spyOn(api, 'get');
  spyOn(api, 'put');
  spyOn(api, 'post');

  $provide.value('Api', api);
}));

moduleモジュールをロードしたらsystem、サービスのインターフェースを持つ単純なオブジェクトを作成するだけですApi。それらに何も実装する必要はありません。

次に、メソッドをスパイする必要があります (メソッドが呼び出されたことをアサートできるようにするため)。

次に、system_centersモジュールをロードし、サービスを注入します。

beforeEach(module('system_centers'));

beforeEach(inject(function(System) {
  system = System;
}));

injectテストに依存関係を注入するために使用されます。System工場に注入するだけです。

テストの残りは何ですか、私はそれらの束を作成しました:

it('should load the system', function() {
  system.loadSystem(1, 0);
  expect(api.get).toHaveBeenCalledWith('lmc/contact/system/1', {card_id : 0});
});

it('should be able to complete the system', function() {
  system.completeSystem(20);
  expect(api.put).toHaveBeenCalledWith('system/complete/20');
});

it('should create the system', function() {
  system.createSystem(1, 3);
  expect(api.post).toHaveBeenCalledWith('contact/system/1', { card_id: 3, type: 'systems', origin: 'lmc'});
});

it('should not create the system if contact_id is 0', function() {
  system.createSystem(0, 20);
  expect(api.post).not.toHaveBeenCalled();
});

it('should not create the system if card_id is 0', function() {
  system.createSystem(1, 0);
  expect(api.post).not.toHaveBeenCalled();
});

それらはほとんど同じです。いくつかのファクトリ メソッドを呼び出し、いくつかのパラメーターを指定して呼び出されていることを期待してApiいます。またはcreateSystem、0 の連絡先またはカード ID で呼び出しても、Api.

さて、これは良いスタートです。さらにテストを続行するか、アプリケーションの他の部分を続行できます。

ここにプランカーがあります: http://plnkr.co/edit/5vfg0Y1G0vo2nnz0xByN?p=preview

于 2014-01-04T11:55:32.797 に答える