4

現在、単体テストを作成するために Jasmine と Karma(Testacular) および Web Storm を使用しています。コントローラーが初期化されるとすぐに呼び出されるメソッドをスパイするのに問題があります。コントローラーの初期化時に呼び出されるメソッドをスパイすることは可能ですか?

私のコントローラーコード、私がスパイしようとしているメソッドはgetServicesNodeList().

myApp.controller('TreeViewController', function ($scope, $rootScope ,$document, DataServices) {
    $scope.treeCollection  =  DataServices.getServicesNodeList();
    $rootScope.viewportHeight = ($document.height() - 100) + 'px';
});

そして、ここにテスト仕様があります:

describe("DataServices Controllers - ", function () {

beforeEach(angular.mock.module('myApp'));
describe("DataServicesTreeview Controller - ", function () {


    beforeEach(inject(function ($controller, $rootScope, $document, $httpBackend, DataServices) {
        scope = $rootScope.$new(),
        doc = $document,
        rootScope = $rootScope;
        dataServices = DataServices;

        $httpBackend.when('GET', '/scripts/internal/servicedata/services.json').respond(...);

        var controller = $controller('TreeViewController', {$scope: scope, $rootScope: rootScope, $document: doc, DataServices: dataServices });

        $httpBackend.flush();
    }));

    afterEach(inject(function($httpBackend){
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    }));

    it('should ensure DataServices.getServicesNodeList() was called', inject(function ($httpBackend, DataServices) {
        spyOn(DataServices, "getServicesNodeList").andCallThrough();

        $httpBackend.flush();
        expect(DataServices.getServicesNodeList).toHaveBeenCalled();
    }));


});
});

メソッドが呼び出されていないと言って、テストは失敗しています。をモックして、DataServicesそれをテスト コントローラーに渡す必要があることはわかっています。しかし、それがモックであるかどうかにかかわらず、そのメソッドをスパイするとき、私はまだ同じ問題を抱えているようです. 誰でもアイデアを持っているか、これを処理する正しい方法に関するリソースを教えてもらえますか?

4

1 に答える 1

5

単体テストを作成するときは、コードの各部分を分離する必要があります。この場合、サービスを分離して個別にテストする必要があります。サービスのモックを作成し、コントローラーに渡します。

var mockDataServices = {
    getServicesNodeList: function () {
        return <insert your sample data here > ;
    }
};

beforeEach(inject(function ($controller, $rootScope, $document) {
    scope = $rootScope.$new(),
    doc = $document,
    rootScope = $rootScope;

    var controller = $controller('TreeViewController', {
        $scope: scope,
        $rootScope: rootScope,
        $document: doc,
        DataServices: mockDataServices
    });
}));

$http 要求を行っているのがサービスである場合は、ユニット コントローラー テストからその部分を削除できます。初期化時にサービスが正しい http 呼び出しを行っていることをテストする別の単体テストを記述します。

于 2013-04-06T17:14:49.957 に答える