1
더미 버전의 서비스를 전달하여 컨트롤러를 테스트하려고합니다. 그러나 카르마가 실행될 때 나는 실제로 주입하려고하는 객체 대신 컨트롤러 정의 (3 행)에 지정된 실제 서비스를 호출합니다.유닛 테스트에서 컨트롤러에 더미 버전의 서비스 전달
제가 잘못하고있는 것을 식별하도록 도와주십시오.
//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);
});
});
은 $ 인젝터에 전달하고 인젝터 PersonnelServiceMock의 인스턴스를 가지고 시도했다. 콘솔 로그에 실제로 PersonnelServiceMock이 반환된다고 표시됩니다. 하지만 여전히 그것은 PersonnelService에 정의 된 아약스 호출을 시도합니다
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)에 지정된 내용이 사용중인 것처럼 보입니다.
고마워요! 이것을 대답으로 받아 들였습니다 ... 그래서 함수 인자 목록에 실제 변수 이름이 아닌 의존성의 이름을 사용 했어야합니다! 다시 한 번 감사드립니다! –
예, 의존성 삽입을 위해 배열 메소드 시그니처를 사용하여 선언 할 경우. 분명히 그렇지 않다면 종속성의 이름과 실제 변수 이름은 동일하고 동일합니다. –