0

メソッド コントローラをテストしようとすると、いくつかの問題が発生します。だから、ここにcontactCtrlという名前の私のコントローラーがあります

'use strict';

(function () {
    angular.module('routerApp').controller('ContactController', function ($scope, contactRepository) {

        $scope.saveContact = function(selectedContact) {
            $scope.errors = [];

            contactRepository.saveContactInfo(selectedContact);

            $scope.contactSelected = false;
        };

        $scope.cancel = function() {
            $scope.contactSelected = false;
            $scope.selectedContact = null;
        };

        $scope.selectContact = function(contact) {
            $scope.contactSelected = true;
            $scope.selectedContact = contact;
        };
    });
}());

これが私のcontactRepositoryです

'use strict';

(function () {
    angular.module('routerApp').factory('contactRepository', function() {
        return {
            saveContactInfo: function (selectedContact) {
                console.log(selectedContact);
            }
        };
    });
}());

そして、ここに contactCtrl.spec.js という名前の私の仕様ファイルがあります

describe('Controller',function() {

    var scope,contactCtrl;

    beforeEach(module('routerApp'));
    beforeEach(inject(function ($rootScope, $controller) {
       scope = $rootScope.$new();
       contactCtrl = $controller('ContactController',{$scope:scope});
    }));

    describe('ContactController', function() {
        it('save method should have contactSelected false', function() {
            expect(contactCtrl.contactSelected).toBe(false);
        });
    });
})

save メソッドを実行したときに実際に機能するかどうかをテストしたいと思います。

4

1 に答える 1

0

実際に関数を呼び出してから、値が期待どおりであることをアサートする必要があります。scopeこれはすべて、コントローラーではなく変数で行う必要があります。

describe('ContactController', function() {
    it('save method should have contactSelected false', function() {
        expect(scope.contatSelected).toBeUndefined();
        scope.saveContact('foo');
        expect(scope.contactSelected).toBe(false);
    });
});

コントローラー メソッドがファクトリ メソッドを呼び出していることを確認したい場合は、スパイを作成し、コントローラー関数を呼び出した後にスパイが呼び出されたことを確認する必要があります。

describe('Controller',function() {

    var scope,contactCtrl, contactRepository;

    beforeEach(module('routerApp'));
    beforeEach(inject(function ($rootScope, $controller, _contactRepository_) {
       scope = $rootScope.$new();

       // inject your factory so we can spy on it
       contactRepository = _contactRepository_;
       contactCtrl = $controller('ContactController',{$scope:scope});

       // create spy
       spyOn(contactRepository, 'saveContactInfo');
    }));

    describe('ContactController', function() {
        it('save method should have contactSelected false', function() {
            expect(scope.contatSelected).toBeUndefined();
            scope.saveContact('foo');
            expect(scope.contactSelected).toBe(false);

            // assert that function was called
            expect(contactRepository.saveContactInfo).toHaveBeenCalled()
        });
    });
});
于 2015-08-04T09:07:54.203 に答える