0

私はそのような AngularJS コントローラーを持っています:

        app.controller('MyCtrl', function($scope, myFactory){  
            $scope.types = myFactory.getTypes();    
            $scope.model= {};    
            $scope.model.type = $scope.types[0].type;

    });
});

すべて正常に動作します。

しかし、Jasmine でこのコントローラーをテストしたいと思います。だから私はそのようにモックmyFactoryして初期化しますmyCtrl:

 describe('Controllers: MyCtrl', function () {

        var MyCtrl, mockedFactory, scope;

        beforeEach(module('app.factories', function ($provide) {
            mockedFactory = {
                getTypes: function(){}
            };

            spyOn(mockedFactory, 'getTypes');
            $provide.value('myFactory', mockedFactory);
        }));

        beforeEach(module('app'));

        beforeEach(inject(function ($rootScope, $controller) {
            scope = $rootScope.$new();
            MyCtrl= $controller('MyCtrl', {
                $scope: scope
            });
        }));

        it('should call AccordTypeFactory.getAvailableTypes()', function () {
            scope.types;
            expect(mockedFactory.getTypes).toHaveBeenCalled();
        });

しかし、私は論理的なバグを持っています:Cannot read property 0 of undefined

私はこのバグを理解しています。ファクトリをモックするため、コントローラー$scope.model.typeのプロパティは定義されていません。これは、ファクトリの結果を使用するためです$scope.types

私の質問は簡単です: どうすればテストを機能させることができますか?

ありがとう

4

2 に答える 2

1
    beforeEach(module('app.factories', function ($provide) {
        mockedFactory = {
            getTypes: function(){ return [{}]; }
        };

        spyOn(mockedFactory, 'getTypes').andCallThrough();
        $provide.value('myFactory', mockedFactory);
    }));

私があなたを正しく理解していれば、あなたの問題は、コントローラーが常に少なくとも1つの要素があることを期待しているのに、モックが配列を返さないことです。要素を含む配列を返すようにモックを設定しandCallThrough()、スパイで使用して実際にモックを呼び出すことができます。

アプリケーションの実行中にファクトリが空の配列を返す可能性がある場合は、アクセスを試みる前に、配列に少なくとも 1 つの要素が含まれていることを確認することをお勧めします。types[0]

于 2013-10-07T10:25:09.680 に答える