1

サービスのダミー バージョンを渡してコントローラをテストしようとしています。ただし、カルマが実行されると、実際のサービスが呼び出されます。これは、注入しようとするオブジェクトではなく、コントローラーの定義 (3 行目) で指定されています。beforeEach(inject(function(....)

私が間違っていることを特定するのを手伝ってください。

//I have a code like the following.
angular.module('myApp')
    .controller('memberSearch2Ctrl', ['$scope', 'PersonnelService', 'SavedSearchService', '$routeParams', '$log',
        function memberSearch2Ctrl($scope, personnelApi, savedSearches, $routeParams, $log) {
            // utilises PersonnelService to make ajax calls to get data from server....
        }
    ]);

// real version of a service that makes ajax calls and returns real data
angular.module('myApp')
    .service('PersonnelService', function($http, $q) {
        //this.search(....)
    });

// dummy version of the above, has the same functions like above just returns hardcoded json
angular.module('myApp')
    .service('PersonnelServiceMock', function($http, $q) {
        // returns hardcoded json for testing purpose
        //this.search(....)
    });


// heres my tests
describe('memberSearch2Ctrl', function() {
    var ctrl, scope, personnelApiMock, savedSearchService;

    beforeEach(module('myApp'));
    beforeEach(inject(function($rootScope, $controller, PersonnelServiceMock, SavedSearchService, $log) {

        personnelApiMock = PersonnelServiceMock; // this sets the PersonnelServiceMock correctly
        console.log(JSON.stringify(PersonnelServiceMock)); // as I see in this line
        console.log(JSON.stringify(SavedSearchService));


        scope = $rootScope.$new();
        ctrl = $controller('memberSearch2Ctrl', {
            $scope: scope,
            personnelApi: PersonnelServiceMock,
            savedSearches: SavedSearchService,
            $routeParams: {},
            $log: $log
        });

    }));

    iit('upon search $scope.searchResults = PersonnelService.searchPaged(...)', function() {
        // however problem lies in the next line
        scope.search(); //  this calls PersonnelService.search insted of PersonnelServiceMock.search
        // even when I have beforeEach(inject(function($rootScope, $controller, >>> PersonnelServiceMock <<<,
        scope.$root.$digest();

        var expected = personnelApiMock.searchPaged(null, null, null);
        var actual = scope.searchResults;
        expect(actual).toEqual(expected);
    });
});

$injector を渡して、インジェクターに PersonnelServiceMock をインスタンス化させようとしました。コンソール ログには、実際に PersonnelServiceMock を取得していると書かれています。それでも、 PersonnelService で定義された ajax 呼び出しを試みます

 beforeEach(inject(function($rootScope, $controller, $injector) {

    personnelApiMock = $injector.get('PersonnelServiceMock');
    savedSearchService = $injector.get('SavedSearchService');
    log = $injector.get('$log');

    console.log(JSON.stringify(personnelApiMock));
    console.log('==========================================');
    console.log(JSON.stringify(savedSearchService));
    console.log('******************************************');

    scope = $rootScope.$new();
    ctrl = $controller('memberSearch2Ctrl', {
      $scope: scope,
      personnelApi: personnelApiMock,
      savedSearches: savedSearchService,
      $routeParams: {},
      $log: log
    });

}));

の呼び出しで指定されたctrl = $controller('memberSearch2Ctrl', { ...})ものが無視され、コントローラー定義で指定されたもの (行 ~3) が使用されているようです。

4

1 に答える 1

1

問題は、次のコード ブロックにあります。

ctrl = $controller('memberSearch2Ctrl', {
    $scope: scope,
    personnelApi: PersonnelServiceMock, <!---
    savedSearches: SavedSearchService,
    $routeParams: {},
    $log: $log
});

次のようにする必要があります。

ctrl = $controller('memberSearch2Ctrl', {
    $scope: scope,
    PersonnelService: PersonnelServiceMock, <!---
    savedSearches: SavedSearchService,
    $routeParams: {},
    $log: $log
});
于 2013-07-22T07:23:29.387 に答える