내 JS 애플리케이션에서 저는 userFactory를 매개 변수로 취하는 mainController를 가지고 있습니다. userFactory는 userService라는 객체로 구성되며, userDetails 객체와 resetUserDetails를 비롯한 일부 메소드가 있습니다. (아래 참조)Jasmine spyOn을 공장에서 정의 된 객체의 메소드와 함께 사용하기
mainController에는 userFactory.userService.resetUserDetails
메서드를 호출하는 logOut 함수가 있습니다. jasmine을 사용하여이 logOut 함수를 테스트하고 싶습니다. 그러나 오류가 발생합니다. 나는 Jasmine에게 아주 새롭다. 그래서 그 무엇인가 분명하지 않다면 사과한다.
먼저 Jasmine 제품군에서 mainController 테스트를 위해 MainControllerSpec을 만듭니다.
이 사양에서는 userFactory라는 팩토리를 주입하고 있습니다.
이spyOn(userFactory, 'userService.resetUserDetails');
오류 : userService.resetUserDetails()
이 존재하지 않는 그러나 나는 오류를 받고 다음과 같이 내 resetUserDetails
방법을 spyOn 것을 시도하고있다.
내 userFactory (userService 객체 외부)에 test라는 함수를 작성하여이 프로세스를 시도했지만 잘 작동하므로 spec의 factory injection이 잘 설정되었음을 알았습니다.
도움을 주시면 감사하겠습니다. mainController 감사
MainControllerSpec.js
describe("MainController", function() {
beforeEach(angular.mock.module('mapModule', 'ngRoute','ngTouch', 'ngAnimate'));
var scope, userFactory;
beforeEach(inject(function($rootScope, $controller, _userFactory_){
scope = $rootScope.$new();
userFactory = _userFactory_;
$controller('mainController', {
$scope: scope
});
}));
describe('The logOut function', function() {
it('should call the resetUserDetails function of the userFactory.userService object and reset the userDetails object', function() {
//spyOn takes in a factory and a method of that factory
spyOn(userFactory, 'userService.resetUserDetails');
//spyOn(userFactory, 'test'); tried this and it works.
scope.logOut();
expect(userFactory.userService.resetUserDetails).toHaveBeenCalled();
});
});
});
로그 아웃 기능 $scope.logOut = function(){
userFactory.userService.resetUserDetails();
//userFactory.test(); //tried this with spyOn in jasmine
}
$scope.logOut = function(){
userFactory.userService.resetUserDetails();
//userFactory.test(); //tried this with spyOn in jasmine
}
userFactory
당신은 조롱 할 필요가mapApp.factory('userFactory', function(){
var userService = {
/*
* Initialize a userDetails object.
*/
userDetails : {
"userID" : null,
"facebookUserID" : "",
"facebookName" : "",
"facebookProfilePic" : "",
"userPrivilegeID" : 1,
"userToken" : "",
"isLoggedIn" : false
},
resetUserDetails : function(){
/*
* This method resets the userDetails object.
*/
this.userDetails = {
"userID" : null,
"facebookUserID" : "",
"facebookName" : "",
"facebookProfilePic" : "",
"userPrivilegeID" : 1,
"userToken" : "",
"isLoggedIn" : false
};
}
};
var test = function(){
/*
* for testing spyOn in Jasmine
*/
};
//return public API so that we can access it in all controllers
return{
userService: userService,
test: test
};
});
: 당신이 할 수있는 일이 경우
는 다음과 같은 것입니다. 사과. 다음은 잘 작동합니다. spyOn (userFactory.userService, 'resetUserDetails'); .. – Sarah
보통 하나 하나의 메소드를 감시하는 대신 컨트롤러 테스트에서 서비스 전체를 모의하려고 할 수 있습니다. 예 : https://stackoverflow.com/a/46595428/3731501 – estus
@estus 조언을 주셔서 감사합니다. 나는 이것을 체크 할 것이다 – Sarah